Обходные пути, описанные выше (спасибо!), Не решают должным образом проблему возврата объектов, предоставленных методу resolve()
отложенного типа, поскольку jQuery вызывает обратные вызовы done()
и fail()
с отдельными параметрами, а не массивом.Это означает, что мы должны использовать псевдомассив arguments
, чтобы получить все разрешенные / отклоненные объекты, возвращаемые массивом deferreds, что выглядит ужасно:
$.when.apply($,deferreds).then(function() {
var objects=arguments; // The array of resolved objects as a pseudo-array
...
};
Поскольку мы передали массив deferreds,было бы неплохо вернуть массив результатов.Было бы также неплохо получить реальный массив вместо псевдомассива, чтобы мы могли использовать такие методы, как Array.sort()
.
. Вот решение, вдохновленное when.js when.all()
метод, который решает эти проблемы:
// Put somewhere in your scripting environment
if (typeof jQuery.when.all === 'undefined') {
jQuery.when.all = function (deferreds) {
return $.Deferred(function (def) {
$.when.apply(jQuery, deferreds).then(
function () {
def.resolveWith(this, [Array.prototype.slice.call(arguments)]);
},
function () {
def.rejectWith(this, [Array.prototype.slice.call(arguments)]);
});
});
}
}
Теперь вы можете просто передать массив отложенных / обещаний и получить массив разрешенных / отклоненных объектов в вашем обратном вызове, например:
$.when.all(deferreds).then(function(objects) {
console.log("Resolved objects:", objects);
});