问题

如何让一个函数等待所有jQuery Ajax请求在另一个函数内完成?

简而言之,我需要等待所有Ajax请求完成之后再执行下一个.但是如何?



解决方法

jQuery现在为此定义了一个"when"函数.

http://api.jquery.com/jQuery.when/

它接受任意数量的Deferred对象作为参数,并在所有对象都解析时执行一个函数.

这意味着,如果你想启动(例如)四个ajax请求,然后在完成后执行一个动作,你可以这样做:

$.when(ajax1(), ajax2(), ajax3(), ajax4()).done(function(a1, a2, a3, a4){
    // the code here will be executed when all four ajax requests resolve.
    // a1, a2, a3 and a4 are lists of length 3 containing the response text,
    // status, and jqXHR object for each of the four ajax calls respectively.
});

function ajax1() {
    // NOTE:  This function must return the value 
    //        from calling the $.ajax() method.
    return $.ajax({
        url: "someUrl",
        dataType: "json",
        data:  yourJsonData,            
        ...
    });
}

在我看来,它使一个干净和清晰的语法,并避免涉及任何全局变量,如ajaxStart和ajaxStop,可能会有不必要的副作用,随着页面的发展.

如果你不提前知道你需要等待多少个ajax参数(即你想使用可变数量的参数),它仍然可以做,但只是有点棘手.请参见将延迟数组传递给$ .when()(也许 jQuery.当使用可变数量的参数进行故障排除时).

如果您需要更深入地控制ajax脚本等的失败模式,您可以保存由.when()返回的对象 - 它是一个jQuery Promise 对象,其中包含所有原始的ajax查询.您可以调用.then()或.fail()来添加详细的成功/失败处理程序.




相关问题推荐