当每个循环中的所有ajax调用成功时如何执行操作?

时间:2011-07-06 04:52:13

标签: ajax jquery

我在.each循环中调用ajax jquery函数,我想在循环内的所有ajax调用完成并成功时执行操作。

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

怎么做?没有async: false,因为这会阻止浏览器。

4 个答案:

答案 0 :(得分:7)

延期可以使您的工作更简单。

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 );

答案 1 :(得分:3)

这是一种方式:

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

您可以根据您的复选框数量计算初始numberOfPendingRequests,或者在每个ajax请求之前以0为增量开始计算,但这是一般的想法。

希望这会有所帮助。干杯

答案 2 :(得分:1)

试试这个:

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!");
    }
}

答案 3 :(得分:0)

查看this post的3.1节,了解等待异步内容结束的完整示例