0

我查看了这篇文章,答案非常好: 等到所有 jQuery Ajax 请求都完成?

但我只想更通用:我想知道我们如何将此逻辑用于服务列表(ajaxservices)和回调列表,例如

ajaxservices = ["url-getdata1", "url-getdata2"];
callbacks = [callbackdata1, callbackdata2];
callbackdata1 = function (data){...}

$.when(/*somehow call all ajaxservices[]*/).done(function (dataList) {
            for (var i = 0; i < callbacks.length; i++) {
                callbacks[i](dataList???[i][0]);/* somehow pass the data as parameter*/
            }

        });

谢谢!

更多信息:http ://api.jquery.com/jQuery.when/

4

2 回答 2

1

不要使用eval,而是使用参数数组来调用函数的函数方法apply

var ajaxservices = ["url-getdata1", "url-getdata2"],
    callbacks = [callbackdata1, callbackdata2];
// assuming a function "callAjax()" that takes an url and returns a promise

var promises = $.map(ajaxservices, callAjax); // loop and generate array

$.when.apply($, promises).done(function () {
    for (var i = 0; i < callbacks.length; i++) {
        callbacks[i].apply(null, arguments[i]);
    }
});
于 2013-10-25T11:26:35.793 回答
0

*更新 - 没有像我预期的那样工作(见下面的真正解决方案)

失败的方法

我找到了一条出路eval……它没有经过全面测试,但看起来还可以。请随时发表您的评论/权衡。

callAjax是一个接收 url 并返回 promise 的方法return $.ajax(...),但是由于我应该使用.when语句执行它,所以我将所有调用放在一个字符串中,以便稍后在.when语句中评估它们。

convertAjaxCallsToString = function () {
    var result = '';
    for (var i = 0; i < ajaxservices.length; i++) {
        result += "callAjax(ajaxservices[" + i + "])";
        if (i + 1 < ajaxservices.length) {
            result += ",";
        }
    }

    return result;
}

由于我预计不会有超过 10 个 ajax 调用,因此我对这 10 个响应(arg 0 - 9)进行了硬编码,如下所示……如果我只使用 3 个 ajax 服务,那么只有 3 个 arg 应该有价值,其他的将是undefined永远不会是 eval 因为callbacks.length也应该是 3。

var ajaxcalls = _self.convertAjaxCallsToString();

$.when(eval(ajaxcalls)).done(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
    for (var i = 0; i < callbacks.length; i++) {
        //If you expect a page response, Each argument is an array with the following structure: [ data, statusText, jqXHR ]
        var data = eval('arg' + i)[0];
        callbacks[i](data);
    }

});

可能的解决方案

调用 ajax 没有像我预期的那样工作,所以我决定使用另一种方法。经过测试,工作正常!

$.when(ajax(0), ajax(1), ajax(2), ajax(3), ajax(4), ajax(5), ajax(6), ajax(7), ajax(8), ajax(9))
.done(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
        for (var i = 0; i < callbacks.length; i++) {
            //If you expect a page response, Each argument is an array with the following structure: [ data, statusText, jqXHR ]
            var data = eval('arg' + i)[0];
            callbacks[i](data);
        }

    });

如果没有要调用的 ajax 服务,ajax 所在的位置将返回 0。

var ajax = function (index) {
            if (index < ajaxservices.length) {
                return callAjax(ajaxservices[index]);
            }

            return 0;
        }
于 2013-10-24T21:54:47.907 回答