我有一个庞大的每个循环,每次迭代都会发出一个ajax请求:
$('.test').each(function() {
$.ajax(function() {...})
.done(function { ... });
}
执行每次迭代后,我想执行另一个警报功能。为此,我尝试使用promise()
$('.test').each(function() {
...
}).promise().done(function () {alert("This is an alert");});
但是,这不起作用:警报在每个循环结束之前执行。有什么建议吗?
答案 0 :(得分:2)
您需要在ajax中触发警报,以便知道它已完成加载代码。这样做......
var totalCount=$('#test').length;
var ajaxCounter=0;
$('#test').each(function() {
$.ajax(function() {
//do stuff here
})
.done(function {
//do other stuff here
ajaxCounter++;
if(ajaxCounter==totalCount){
alert('this is an alert at the end');
}
});
}
如果某些ajax调用有可能无法触发,您可能还想使用setTimer在太多时间过去时引发警报...或者只是使用延迟失败方法来跟踪他们是这样的:
var totalCount=$('#test').length;
var ajaxCounter=0;
$('#test').each(function() {
$.ajax(function() {
//do stuff here
})
.done(checkAjaxFinished)
.fail(checkAjaxFinished);
}
function checkAjaxFinished(){
ajaxCounter++;
if(ajaxCounter==totalCount){
alert('this is an alert at the end');
}
}
答案 1 :(得分:0)
ID
必须是唯一的。
改用class。
此外,ajax
调用无法在循环中运行。更好的处理方法是使用递归函数。
尝试:
假设您有名为test
的课程。
var len = $('.test').length;
call_ajax(0);
function call_ajax(i){
$.ajax(function() {...})
.complete(function {
if(i < len){
call_ajax(i+1); //recursive call
}
});
}
答案 2 :(得分:-1)
是的,Lenny说,你的代码执行得很好。
$('#test').each(function() {
...
}).promise().done(function () {alert("This is an alert");});
将设置所有ajax调用以运行但不等待每个调用完成。这就是在呼叫完成之前警报发生的原因。你的promise对象是在每个循环而不是ajax调用。如果您为每个ajax调用添加promise().done()/complete()
并计算其中有多少是完整的,您可以知道所有这些调用何时完成。