Как выполнить действие, когда все вызовы ajax в каждом цикле завершаются успешно? - PullRequest
2 голосов
/ 06 июля 2011

Я вызываю функцию jjery ajax внутри цикла .each и хочу выполнить действие только тогда, когда все вызовы ajax внутри цикла завершатся и завершатся успешно.

$(".checked-box").each(function () {
     // ajax call goes here
});
$('.messsage').html('all requests done');

Как это сделать? без async: false, потому что это блокирует браузер.

Ответы [ 4 ]

8 голосов
/ 06 июля 2011

Отсрочка может упростить вашу работу.

var deferreds = $('.checked-box').map(function(i, elem) {
  return $.ajax(params);
});

$.when.apply(null, deferreds.get()).then(function() { ... });

Надеюсь, это сработает.

Концепция:

$.when(
    $.ajax( "1" ),
    $.ajax( "2" ),
    $.ajax( "3" )
).then( successFunc, failureFunc );
3 голосов
/ 06 июля 2011

Это один из способов:

var numberOfPendingRequests = 8;
$(".checked-box").each(function () {   
   $.ajax({
     success: function(){
        ...
        numberOfPendingRequests --;
        if(numberOfPendingRequests == 0) allDone();
     }
   });
});
function allDone(){
  $('.messsage').html('all requests done');
}

Вы можете вычислить начальное значение numberOfPendingRequests на основе вашего количества флажков или начать его с 0, увеличивая его перед каждым запросом ajax, но это общая идея..

Надеюсь, это поможет.Приветствия

1 голос
/ 06 июля 2011

Попробуйте это:

AjaxRequestCount = 0;
//JUST prepare ajax requests here, do not send yet...
$(".checked-box").each(function () {
     AjaxRequestCount += 1; //Count number of ajax request
     //set "success:" of each ajax to Success() function
});

//Send ajax requests here, use a loop...

for(i=0;i<AjaxRequestCount;i++)
{
   //ajax[i].send
} 

//Fires for each ajax success...
function Success()
{
    SuccessAjaxRequestCount += 1;
    Check(); //Check right after each ajax success
}

//Checks if already reached the expected number of ajax success...
function Check()
{
    if(SuccessAjaxRequestCount  == AjaxRequestCount )
    {
        alert("done!");
    }
}
0 голосов
/ 06 июля 2011

посмотрите в разделе 3.1 из этого поста для полного примера ожидания завершения асинхронного заполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...