jQuery Deferred - ожидание завершения нескольких запросов AJAX
47656 просмотра
3 ответа
У меня есть трехслойная цепочка отложенных вызовов 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();
};
Автор: brittohalloran
Источник
Размещён: 12.11.2019 09:51
Ответы (3)
107 плюса
Вы можете использовать .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
});
}
Автор: brittohalloran
Размещён: 02.07.2011 04:50
27 плюса
Если вы ссылаетесь на jQuery.When
doc, если один из ваших вызовов 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();
});
Автор: Mordhak
Размещён: 29.11.2012 02:08
7 плюса
Спасибо за ответ brittohalloran. Я также использую Underscore, поэтому я смог очень аккуратно применить ваше решение с картой, вроде этого:
$.when.apply($, _.map(data, function(i) {
return getNote(i.key);
})).done(function() {
alert('Be Happy');
});
Злой полезен.
Автор: Travis Размещён: 06.08.2012 10:10Вопросы из категории :
- jquery Прокрутка переполненных DIV с помощью JavaScript
- jquery Экранирование строк HTML с помощью jQuery
- jquery Как сравнить HTML-сущность с JQuery
- jquery Есть ли функция "существует" для jQuery?
- jquery Как удалить все параметры в окне выбора, а затем добавить один вариант и выбрать его с помощью jQuery?
- jquery Получение идентификатора элемента, который вызвал событие
- jquery Как получить результат из модального диалога в JQuery
- jquery Удалите все классы, начинающиеся с определенной строки.
- jquery Как мне остановить эффект в jQuery
- jquery Как показать загрузочный счетчик в jQuery?
- jquery-deferred Как можно использовать jQuery deferred?
- jquery-deferred Как вы работаете с массивом jQuery Deferreds?
- jquery-deferred jQuery откладывает и обещает - .then () против .done ()
- jquery-deferred Передайте массив отложенных в $ .when ()
- jquery-deferred jQuery.when - обратный вызов для случаев, когда ВСЕ отложенные больше не являются «неразрешенными» (разрешенными или отклоненными)?
- jquery-deferred jQuery Deferred - ожидание завершения нескольких запросов AJAX
- jquery-deferred pagepeed (хром) не распознает задержку JavaScript
- jquery-deferred Как связать последовательность отложенных функций в jQuery 1.8.x?
- jquery-deferred веб-работники против обещаний
- jquery-deferred JQuery отложенный отклонить немедленно