3

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

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

我想肯定有一些好的 ajax 管理器/队列可以处理这种事情。或者甚至可能是一些通用的异步任务处理东西.. ;)

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

4

3 回答 3

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();
};

这是您的 JSFiddle的一个分支,它使用您的示例代码对其进行了演示。

由于my_ajax从不调用, 如果所有参数都是调用,则deferred.reject()链接 a.fail将毫无意义。$.when$.whenmy_ajax

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

于 2012-06-15T07:18:37.520 回答
1

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

https://github.com/cujojs/when

于 2012-06-14T10:39:58.937 回答
0

我最近使用的一个解决方案效果不错。通过一个 for 循环,我调用了一个方法,该方法又使用了一个 window.setTimeout 函数,该函数使用正确的数据执行 ajax 调用。我使用了一个 max 和 counter 变量来检查所有 ajax 调用是否正确执行(在成功函数的末尾增加计数器)。另一个 setTimeout 调用的函数检查计数器是否等于最大值。如果不是,则在新的 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);
    }
}
于 2012-06-14T10:28:23.490 回答