我在.each循环中调用ajax jquery函数,我想在循环内的所有ajax调用完成并成功时执行操作。
$(".checked-box").each(function () {
// ajax call goes here
});
$('.messsage').html('all requests done');
怎么做?没有async: false
,因为这会阻止浏览器。
答案 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节,了解等待异步内容结束的完整示例