$.when()
не создает еще один массив deferreds. Он возвращает одно обещание, которое будет разрешено, когда все обещания, которые вы передали, были разрешены (или отклонены, если какое-либо из этих обещаний отклонено).
Результаты, переданные разрешенному обработчику единого обещания, представляют собой массив результатов. В некоторых случаях (например, с $.ajax()
, это будет массив массивов результатов).
Итак, что у вас было:
$.when.apply($, array).then(function(arrayOfResults) {
(do something here ...)
});
будет прекрасно работать говорю вам, когда все обещания, вы прошли в $.when()
уже finised. Код в обработчике .then()
будет передан массив результатов и будет вызываться только тогда, когда все обещания, которые вы передали $.when()
, были разрешены.
Если внутри обработчика .then()
вы хотите запустить N более асинхронных операций, вы можете просто использовать $.when()
снова внутри. Или, каждый из ваших первоначальных асинхронных вызовов хочет иметь свою собственную цепочку, тогда вы должны связать их, прежде чем передавать их на $.when()
, поэтому то, что передается $.when()
, является результатом цепочки каждой отдельной цепочки.
Например, вы могли бы сделать это:
var p1 = $.ajax(...).then(...).then(...).then(...).then(...);
var p2 = $.ajax(...).then(...).then(...).then(...);
$.when(p1, p2).then(function(arrayOfResults) {
// will be executed when all the chained operations in p1 and p2 are done
});
Или вы могли бы сделать это для другой серии параллельных операций:
$.when.apply($, array).then(function(arrayOfResults) {
// first up N more async operations
return $.when.apply($, newArray).then(...);
});
Если вы хотите помочь за это, вы вам нужно будет более конкретно узнать о вашей проблеме. До сих пор, похоже, что это может быть связано с одним из обстоятельств выше.
Основываясь на отредактированном вопрос, вы можете сделать это:
$.when.apply($, arrayOfDeferreds).then(function() {
var args = Array.prototype.slice.call(arguments);
var anotherArrayOfDeferreds = args.map(function(item){
return item.getSomething(); // item.getSomething() returns an deferred.
});
$.when.apply($, anotherArrayOfDeferreds).then(function() {
// called when this new array of deferreds is done
});
});
Но это немного необычной структурой. Обычно, если после операции async выполняется больше операций async, вы не разрешаете и не передаете элемент, который затем можно использовать для последующей операции async, а скорее вы просто связываете операцию async прямо там, где у вас есть Это.
Таким образом, вместо того, чтобы делать это в вашей первоначальной асинхронной операции:
d.resolve(item);
, которые вы должны использовать сейчас, вы могли бы сделать это:
return item.getSomething();
Это просто цепь следующего асинхр на предыдущем, а ваш оригинал $.when()
будет работать для всех.
_ "он создает еще один массив deferreds, который по существу нуждается еще $ .when.apply(), и которые не могут быть решены с помощью .then()" _ Можно создать stacksnippets, jsfiddle http://jsfiddle.net, чтобы продемонстрировать? – guest271314