2010-10-17 4 views
14

У меня есть некоторые Ajax звонки в моем document.ready()JQuery: ждать, пока все Ajax звонки не закончу затем продолжить

как:

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?

+0

Смотрите другие мои ответы здесь: http://stackoverflow.com/a/11315571/49885, ajaxStop является то, что вы хотите, его построили в так JQuery 1.0 –

ответ

16

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

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

Этот путь MyFunc выполняется после 2 Ajax звонки сделаны и myFailure если ни одна есть ошибка.

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

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

К сожалению мой английский: P

+1

Как бы вы их ни называли - отложенные объекты, обещания и т. Д. - они кажутся гораздо лучшим решением, чем параллельные петли для меня –

1

вы можете использовать успеха на (то есть функция обратного вызова Аякса JQuery), как показано ниже:

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

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

ajax

+0

как я могу использовать это в моем коде? –

+1

@Haim Evgi: Переместите код, который у вас есть после вызова, и вы хотите выполнить его после завершения вызова внутри обратного вызова. –

+0

Я отредактировал свой код согласно вашему требованию. Вы можете использовать ajax вместо getjson, как описано выше. – Alpesh

6

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

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

Спасибо, это прекрасно работало для меня.(инициирующий initdone) – tsdexter

+0

Я попробовал async: false и все еще имел проблемы. Решение вызова функции отправки в ajax было идеальным. Благодаря! –

3

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

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

Этот ответ, кажется, работает в любых условиях: https://stackoverflow.com/a/3709809/813154

Смежные вопросы