Jquery: дождитесь окончания всех вызовов ajax, затем продолжите
У меня есть некоторые вызовы ajax в моем документе .ready()
like:
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
});
})(j)
}
//DO NOT CONTINUE UNTIL FINISH AJAX CALLS
........
MORE JQUERY CODE
Как я могу заставить его ждать и не продолжать, пока мы не получим все обратные вызовы из запросов ajax?
Ответы
Ответ 1
Мне вообще не нравится какой-либо ответ, лучший способ (с JQuery 1.5+) - использовать объекты с отсрочкой, это объекты для управления асинхронными вызовами, вы можете решить:
$.when($.ajax("/page1.php"), $.ajax("/page2.php"))
.then(myFunc, myFailure);
Таким образом myFunc выполняется после выполнения 2 вызовов ajax и myFailure, если одна из них имеет ошибку.
Подробнее об этом можно узнать в официальной документации jquery: JQuery Deferred Object
Я пишу это решение, если кто-нибудь увидит этот пост, он может быть полезен.
Извините мой английский: P
Ответ 2
Во-первых, вы можете рассмотреть возможность запуска кода запуска одним вызовом.
Второе: вместо ожидания просто вызовите другой вызов функции. для вышеуказанного кода он должен выглядеть примерно так:
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
if (j === 7) {
initDoneDoMoreStuff()
}
});
})(j)
}
или триггер:
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
if (j === 7) {
$(document).trigger("initdone");
}
});
})(j)
}
$(document).bind("initdone", function() {....});
Ответ 3
Мне было нелегко это сделать, но, может быть, вы нашли мой код полезным. Процесс отправки всех форм в dom и после того, как все они сохранены, перенаправляет пользователя на другую страницу.
formulario = $('form');
formulariolongitud = formulario.length;
i = 0;
formulario.each(function(index, value) {
$(this).ajaxSubmit({
async: false,//not sure i
success: function() {
i++;
if(i === formulario.length) {//this is the last one to submit
window.location.replace(whatever);
}
}
});
});
Ответ 4
вы можете использовать sucess (т.е. функцию обратного вызова ajax jquery), как показано ниже:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: function(data){
//Write your code here.
}
});
Вы можете получить документацию по ajax ниже -
ajax
Ответ 5
Проблема с чем-то вроде if (j == 7) - это ситуация, когда 7-й запрос очень быстрый, и даже один из других медленный. Даже если вы поставили его в очередь последним, это может быть не последним.
Этот ответ, похоже, работает для всех условий:
fooobar.com/info/14553/...