等到每个函数(jQuery)结束

时间:2014-07-26 17:06:19

标签: jquery ajax each

我有这个:

$.each(.., function() {
    $(this).destroy() // call ajax
});

我想确保每个函数都已完成,并且ajax调用也是如此。 无论如何要做到这一点?我尝试了$.when功能,但效果不佳。

ajax调用不是直接的,有一个函数让我成为一个ajax进程。 所以我需要在$ .ajax命令之外验证。

6 个答案:

答案 0 :(得分:6)

您可以使用承诺:

var requests = [];
$.each(..., function() {
    var promise = $.ajax(...);
    requests.push(promise); 
});

$.when.apply($, requests).done(function() {
    // all AJAX requests completed here
}).fail(function() {
    // will be called if any AJAX request failed
});

这就是说,我个人会避免在循环中进行许多类似的AJAX调用。制作一个大型AJAX呼叫而不是许多小型呼叫效率要高得多。

答案 1 :(得分:0)

最简单的方法可能就是使用async $.ajax参数简单地使所有ajax调用同步:

$.each(..., function(){
    $.ajax({
        url: "/script.php",
        async: false
    });
});

这样,在最后一个请求完成之前,你不会启动ajax请求,所以你知道一旦你的循环结束,所有的请求都将完成。

答案 2 :(得分:0)

不是很优雅,但应该有效:

var numCalls = 5, ajaxes = 0;

$.each(numCalls, function(i, v) {
    $.ajax({
        url: 'blah'     
    })
    .always(function(){
        ajaxes += 1;
        checkDone();
    });
});
function checkDone(){
    if(ajaxes === numCalls){
        doSomething();
    }
}

答案 3 :(得分:0)

你可以让每个调用分配它对一个数组的承诺,一段时间之后检查所有数组元素已经完成

var jqxhr = [];
$.each(....
    jqxhr.push($.ajax(......));
}); // end of each loop

使用

检查每个通话的状态
$.each(jqxhr,function(idx,xhr) {
   if (xhr.statuscode != 200) { ... }

});

答案 4 :(得分:0)

我不确定,如果您可以通过发送异步请求来实现此目的。但是,如果您使用同步请求很好,则需要添加async: false;

$.ajax({
//set properties
async: false;
//other properties
})

但是使用同步请求可能会导致浏览器等待并导致响应时间变慢。

答案 5 :(得分:0)

以下是另一种选择:使用ajaxStop功能。

$.each(..., function(){
    $.ajax(...);
});

$(document).ajaxStop(function(){
    console.log("All done!");
}

绑定时,此函数检查已完成或取消的ajax请求(包括非jQuery请求),并在所有未完成的请求完成后触发回调。这允许您创建所需的所有异步Ajax请求,而无需更改实际请求的方式。

注意:如果在页面的其他位置同时进行ajax调用,则此方法也将等待这些调用。