這是應該做的伎倆:
$.whenAllDone = function() {
var deferreds = [];
var result = $.Deferred();
$.each(arguments, function(i, current) {
var currentDeferred = $.Deferred();
current.then(function() {
currentDeferred.resolve(false, arguments);
}, function() {
currentDeferred.resolve(true, arguments);
});
deferreds.push(currentDeferred);
});
$.when.apply($, deferreds).then(function() {
var failures = [];
var successes = [];
$.each(arguments, function(i, args) {
// If we resolved with `true` as the first parameter
// we have a failure, a success otherwise
var target = args[0] ? failures : successes;
var data = args[1];
// Push either all arguments or the only one
target.push(data.length === 1 ? data[0] : args);
});
if(failures.length) {
return result.reject.apply(result, failures);
}
return result.resolve.apply(result, successes);
});
return result;
}
退房this Fiddle來看看它是如何工作的。
基本上它會等待所有延遲完成,無論它們是否失敗並收集所有結果。如果我們發生故障,則返回的延遲將失敗並顯示所有故障列表,並以其他方式成功解決。
你可能想看看承諾http://api.jquery.com/promise/ – BlueBird 2013-02-26 15:41:02
@BlueBird:怎麼樣?承諾需要我沒有的jquery對象。你可以添加一個例子嗎? – Naor 2013-02-26 15:47:38
@BlueBird:'$ .when'已經返回一個承諾對象,即OP已經使用承諾。 – 2013-02-26 15:48:47