http://jsfiddle.net/mNJ6D/
.
$.when()
의 실제 jQuery 구현에서 수정되었으므로 처음에는
resolve
d 약속을 기다리거나
reject
에 대한 약속을 제외하고는 원본과 완전히 동일합니다.
(function($) {
$.reverseWhen = function(subordinate /* , ..., subordinateN */) {
var i = 0,
rejectValues = Array.prototype.slice.call(arguments),
length = rejectValues.length,
// the count of uncompleted subordinates
remaining = length !== 1 || (subordinate && jQuery.isFunction(subordinate.promise)) ? length : 0,
// the master Deferred. If rejectValues consist of only a single Deferred, just use that.
deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
// Update function for both reject and progress values
updateFunc = function(i, contexts, values) {
return function(value) {
contexts[ i ] = this;
values[ i ] = arguments.length > 1 ? Array.prototype.slice.call(arguments) : value;
if(values === progressValues) {
deferred.notifyWith(contexts, values);
} else if (!(--remaining)) {
deferred.rejectWith(contexts, values);
}
};
},
progressValues, progressContexts, rejectContexts;
// add listeners to Deferred subordinates; treat others as rejected
if (length > 1) {
progressValues = new Array(length);
progressContexts = new Array(length);
rejectContexts = new Array(length);
for (; i < length; i++) {
if (rejectValues[ i ] && jQuery.isFunction(rejectValues[ i ].promise)) {
rejectValues[ i ].promise()
.done(deferred.resolve)
.fail(updateFunc(i, rejectContexts, rejectValues))
.progress(updateFunc(i, progressContexts, progressValues));
} else {
--remaining;
}
}
}
// if we're not waiting on anything, reject the master
if (!remaining) {
deferred.rejectWith(rejectContexts, rejectValues);
}
return deferred.promise();
};
})(jQuery);
그들은 모두 첫 번째 실패 두 번째를 동시에 시작하거나해야 : 당신이 jQuery를 장착 한 후에
는 바로이 코드를 드롭? – Bergi
@Bergi 어느 것이 든 작동한다고 생각합니다. 둘 다 다양한 사용 사례에서 최적이라고 생각합니다. – Parris
예,하지만 그 개념은 매우 다릅니다. 그래서 어느 것이 필요합니까? – Bergi