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/...