jquery: дождитесь окончания всех вызовов ajax и продолжайте

У меня есть несколько вызовов ajax в моем документе.ready()

лайк:

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?

5 ответов

Решение

Мне вообще не нравится какой-либо ответ, лучший способ (начиная с Jquery 1.5+) - использовать отложенные объекты, это объекты для манипулирования асинхронными вызовами, которые вы можете решить:

$.when($.ajax("/page1.php"), $.ajax("/page2.php"))
  .then(myFunc, myFailure);

Таким образом, myFunc выполняется после двух вызовов ajax и myFailure, если любой из них имеет ошибку.

Вы можете прочитать больше об этом в официальной документации jquery: JQuery Deferred Object

Я пишу это решение, если кто-нибудь увидит этот пост, это может быть полезно.

Извините мой английский:P

Во-первых, вы можете рассмотреть возможность выполнения кода запуска в одном вызове.
Второе: вместо ожидания просто вызовите другой вызов функции. для приведенного выше кода это должно выглядеть примерно так:

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() {....});

Мне было нелегко сделать это, но, возможно, вы найдете мой код полезным. Это процесс отправки всех форм в 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);
            }
        } 
    });                         
});

Вы можете использовать sucess (т.е. функцию обратного вызова ajax jquery), как показано ниже:

$.ajax({
  url: url,
 dataType: 'json',
 data: data,
 success: function(data){
 //Write your code here.
    }
});

Вы можете получить документацию AJAX ниже -

Аякса

Проблема с чем-то вроде if (j == 7) заключается в ситуации, когда 7-й запрос очень быстрый, и даже один из других - медленный. Даже если вы поставили его в очередь последним, он может оказаться не последним.

Этот ответ, кажется, работает для всех условий: /questions/26774961/podozhdite-poka-vse-zaprosyi-jquery-ajax-budut-vyipolnenyi/26774981#26774981

Другие вопросы по тегам