6

我有一些(可以说是 5 个jQuery.ajax)ajax 请求,我使用函数同时运行这些请求。

现在我想同步和汇总他们的结果,我使用jQuery.when函数来实现这一点。

我的问题是,$.when一旦其中一个请求失败,就会立即返回,即使其他请求成功,也会阻止它们返回。

如何同步并从我的所有 ajax 请求(那些失败的和成功的)中获取所有结果?

4

2 回答 2

0

您可以定义一个、两个或三个更新函数(取决于您想要做什么)来获取相应承诺(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

于 2012-11-24T13:16:37.587 回答
0

工作演示: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。

可能有更有效的方法来实现相同的目标,尽管这是我首先想到的。

于 2012-11-24T13:49:24.043 回答