等待每个函数(jQuery)结束



我知道了:

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

我想确保每个函数和ajax调用都完成了。还有别的办法吗?我试过$.when函数,它不太好用。

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

你可以使用一个承诺:

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调用要比进行多次小的调用有效率得多。

可能最简单的方法是使用async参数与$.ajax:

使所有ajax调用同步。
$.each(..., function(){
    $.ajax({
        url: "/script.php",
        async: false
    });
});

这样,在最后一个请求完成之前不会启动ajax请求,因此您将知道,一旦循环完成,所有请求将完成。

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

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

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

不是很优雅,但应该可以工作:

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

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

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

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

});

还有一个选择:使用ajaxStop函数

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

绑定后,该函数检查完成或取消的ajax请求(包括非jquery请求),并在所有未完成的请求完成后触发回调。这允许您在不需要更改实际发出请求的方式的情况下发出所有您想要的异步ajax请求。

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

最新更新