JQuery Отложенное - ожидая завершения нескольких запросов AJAX
У меня есть трехслойная глубокая цепочка отложенных вызовов 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();
};
Ответы
Ответ 1
Вы можете использовать .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
});
}
Ответ 2
Если вы ссылаетесь на jQuery.When
doc, если один из ваших вызовов ajax терпит неудачу, будет вызван callback fail
, даже если все последующие ajax call haven ' t закончен еще. В этом случае вы не уверены, что все ваши вызовы завершены.
Если вы хотите дождаться всех своих вызовов, независимо от результата, вы должны использовать другой отложенный следующим образом:
$.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();
});
Ответ 3
Спасибо за ответ brittohalloran. Я также использую Underscore, поэтому я смог очень эффективно применять ваше решение с помощью карты, вроде как:
$.when.apply($, _.map(data, function(i) {
return getNote(i.key);
})).done(function() {
alert('Be Happy');
});
Злой полезный.