Đây là cái gì đó nên làm các trick:
$.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;
}
Check-out this Fiddle để xem cách nó hoạt động.
Về cơ bản, nó chờ tất cả Trì hoãn hoàn thành bất kể chúng có bị lỗi hay không và thu thập tất cả các kết quả. Nếu chúng ta có thất bại, sự trì hoãn được trả về sẽ thất bại với một danh sách tất cả các thất bại và giải quyết với tất cả những thành công khác.
Bạn có thể muốn xem xét các lời hứa http://api.jquery.com/promise/ – BlueBird
@BlueBird: Làm cách nào? lời hứa yêu cầu đối tượng jquery mà tôi không có. Bạn có thể thêm một ví dụ? – Naor
@BlueBird: '$ .when' đã trả về đối tượng lời hứa, tức là OP đã sử dụng lời hứa. –