我有一些(可以说是 5 个jQuery.ajax
)ajax 请求,我使用函数同时运行这些请求。
现在我想同步和汇总他们的结果,我使用jQuery.when
函数来实现这一点。
我的问题是,$.when
一旦其中一个请求失败,就会立即返回,即使其他请求成功,也会阻止它们返回。
如何同步并从我的所有 ajax 请求(那些失败的和成功的)中获取所有结果?
您可以定义一个、两个或三个更新函数(取决于您想要做什么)来获取相应承诺(ajax 回调)的响应:
function bindPromises(updateSuccess, updateFail, updateAnyway) {
var arrPromises = [];
// automate the promise retrieval if you want, that's up to you.
arrPromises[0] = ajaxRequest1();
arrPromises[1] = ajaxRequest2();
arrPromises[2] = ajaxRequest3();
arrPromises[3] = ajaxRequest4();
arrPromises[4] = ajaxRequest5();
for(var j = 0; j < arrPromises.length; j++) {
arrPromises[j].then( updateSuccess, updateFail, updateAnyway );
}
}
或者,如果您想进一步自动化:
function bindPromises(arrayOfAjaxCalls, updateSuccess, updateFail, updateAnyway) {
var arrPromises = [];
for(var i = 0; i < arrayOfAjaxCalls.length; i++) {
arrPromises[i] = (arrayOfAjaxCalls[i])();
arrPromises[i].then( updateSuccess, updateFail, updateAnyway );
}
}
如果您不熟悉 Promises,我想向您推荐一篇涵盖该主题的精彩文章:Understanding jQuery.Deferred and Promise
工作演示: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();
}
该函数返回一个承诺。您附加了一个与您提供给 $.when() 的处理程序略有不同的完成处理程序。该函数跟踪每个 ajax 承诺的响应。每当它发现所有 ajax Promise 都返回了数据,无论是成功还是失败,它都会解决这个 Promise。
可能有更有效的方法来实现相同的目标,尽管这是我首先想到的。