当一系列jquery ajax调用完成时执行函数(!)

时间:2012-06-14 10:11:22

标签: javascript jquery ajax

我需要进行一系列(1-20)ajax调用,并且当它们全部完成时我需要调用另一个函数。完成后我的意思是当$ .ajax({complete:...})被调用时。

我看着使用$ .when,但是在jsfiddle上摆弄它后我遇到了2个问题。 1. $ .then和$ .done在我完成所有回调之前被调用。 2.如果一个单独的ajax调用失败,它根本就不会被调用。 基本上,似乎$ .done被称为成功,而不是完整。

我认为必须有一些好的ajax管理器/队列可以处理这种东西。或者甚至可能是一些通用的异步任务hanlding thingy ..;)

小提琴:http://jsfiddle.net/zvSgX/2

3 个答案:

答案 0 :(得分:2)

如果您不喜欢$.ajax时的默认jQuery选项 调用解析他们的延迟对象,你可以编写自己的包装器;

var my_ajax = function (options) {

    var deferred = $.Deferred();
    var user_complete = options.complete;

    options.complete = function (jqXHR, textStatus) {
        if (user_complete) user_complete(jqXHR, textStatus);
        deferred.resolve();
    };

    $.ajax(options);

    return deferred.promise();
};

这是一个fork of your JSFiddle,可以将您的动作与其进行演示 示例代码。

由于my_ajax无法呼叫deferred.reject(),因此将.fail链接到$.when 如果$.when的所有参数都是my_ajax来电话,那将毫无意义。

希望有帮助!如果我能澄清任何事情,请告诉我。

答案 1 :(得分:1)

您可以使用promise模式来解决此问题 您可以使用when.js库来解决此类问题 教程和样本可在以下位置获得

https://github.com/cujojs/when

答案 2 :(得分:0)

我最近使用的解决方案效果不错imo。通过for循环,我调用了一个方法,该方法又使用一个函数执行带有正确数据的ajax调用的window.setTimeout。我使用了max和counter变量来检查所有ajax调用是否正确执行(成功函数结束时的增量计数器)。另一个setTimeout调用的函数检查计数器是否等于max。如果没有,请在新的setTimeout中再次调用该方法,否则调用必须在最后执行的函数。

所以在代码中:

var count = 0, max = 0;

function batchCall() {
var a = [{
    method: "DoThis",
    params: { param1: 1, param2: 2 }
}, {
    method: "DoThat",
    params: { param1: 3 }
}]

max = a.length;

for (var i = 0; i < max; i++) {
    callAjax(a[i]);
}

window.setTimeout(checkAllFinished, 100);
}

function callAjax(o) {
    window.setTimeout(function() {
        // do ajax call here 
    }, 0);
}

function checkAllFinished() {
    if (count == max) {
        // do what you need to do when all are called
    }
    else {
        window.setTimeout(checkAllFinished, 100);
    }
}