我有一些(比方说 5)ajax 请求,我使用 jQuery.ajax
函数同时运行。
现在我想同步和聚合它们的结果,我使用 jQuery.when
函数来实现这一点。
我的问题是,一旦其中一个请求失败,$.when
就会返回,并阻止其他请求返回,即使它们成功。
如何同步并获取所有 ajax 请求的所有结果(失败的和成功的)?
最佳答案
工作演示:http://jsbin.com/ocawoj/4/edit
function waitForAllPromisesToFinish () {
var i,
responses = [],
deferred = $.Deferred(),
helpers = {
addToResponses: function (index, data) {
responses[index] = data;
var i = 0,
isAnyNull = false;
for (i = 0; i < responses.length; i++) {
if (responses[i] === null) {
isAnyNull = true;
break;
}
}
if (isAnyNull === false) {
deferred.resolve(responses);
}
},
setupPromise: function (promise, index) {
promise.always(function () {
var args = Array.prototype.slice.call(arguments);
helpers.addToResponses(index, args);
});
}
},
ajaxPromises = Array.prototype.slice.call(arguments);
for (i = 0; i < ajaxPromises.length; i++) {
responses[i] = null;
}
for (i = 0; i < ajaxPromises.length; i++) {
helpers.setupPromise(ajaxPromises[i], i);
}
return deferred.promise();
}
该函数返回一个 promise 。您附加一个与您提供给 $.when() 的处理程序略有不同的完成处理程序。该函数跟踪每个 ajax Promise 的响应。每当它发现所有 ajax Promise 都已返回数据时,无论成功还是失败,它都会解析该 Promise。
可能有更有效的方法来实现相同的目的,尽管这是我首先想到的。
关于jQuery ajax 和 "when"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541260/