JQuery:尝试在每个之后执行函数,而不是工作

时间:2013-12-06 04:57:59

标签: jquery asynchronous

我有一个庞大的每个循环,每次迭代都会发出一个ajax请求:

$('.test').each(function() {
    $.ajax(function() {...})
    .done(function { ... });
}

执行每次迭代后,我想执行另一个警报功能。为此,我尝试使用promise()

$('.test').each(function() {
    ...
}).promise().done(function () {alert("This is an alert");});

但是,这不起作用:警报在每个循环结束之前执行。有什么建议吗?

3 个答案:

答案 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()并计算其中有多少是完整的,您可以知道所有这些调用何时完成。