我需要进行一系列(1-20)ajax调用,并且当它们全部完成时我需要调用另一个函数。完成后我的意思是当$ .ajax({complete:...})被调用时。
我认为必须有一些好的ajax管理器/队列可以处理这种东西。或者甚至可能是一些通用的异步任务hanlding thingy ..;)
答案 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库来解决此类问题 教程和样本可在以下位置获得
答案 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);
}
}