jQuery Deferred-ожидание завершения нескольких запросов AJAX [дубликат]
этот вопрос уже есть ответ здесь:
- передать в массив Deferreds $.когда() 9 ответов
У меня есть трехслойная глубокая цепочка отложенных вызовов ajax, и в идеале они собираются пнуть обещание полностью, когда самый глубокий слой заканчивается (делает меня вещью начала... "нам нужно идти глубже!").
проблема в том, что я отправляю много запросов ajax (возможно, сотни) сразу и нужно отложить, пока все они не будут выполнены. Я не могу полагаться на то, что последнее будет сделано последним.
function updateAllNotes() {
return $.Deferred(function(dfd_uan) {
getcount = 0;
getreturn = 0;
for (i = 0; i <= index.data.length - 1; i++) {
getcount++;
$.when(getNote(index.data[i].key)).done(function() {
// getNote is another deferred
getreturn++
});
};
// need help here
// when getreturn == getcount, dfd_uan.resolve()
}).promise();
};
3 ответа:
можно использовать
.when()
и.apply()
С несколько отложенным. Чрезвычайно полезно:function updateAllNotes() { var getarray = [], i, len; for (i = 0, len = data.length; i < len; i += 1) { getarray.push(getNote(data[i].key)); }; $.when.apply($, getarray).done(function() { // do things that need to wait until ALL gets are done }); }
Если вы ссылаетесь на
jQuery.When
док, если один из ваших вызовов ajax не удается,fail
мастер обратного вызова будет вызван, даже если все следующие ajax вызова еще не закончены. В этом случае вы не уверены, что все ваши звонки закончены.Если вы хотите дождаться всех ваших звонков, независимо от того, какой результат, вы должны использовать другой отложенный, как это :
$.when.apply($, $.map(data, function(i) { var dfd = $.Deferred(); // you can add .done and .fail if you want to keep track of each results individualy getNote(i.key).always(function() { dfd.resolve(); }); return dfd.promise(); });