从动态创建的ajax调用列表中读取结果

时间:2014-01-03 10:57:19

标签: javascript jquery ajax

我正在创建一个动态数组af ajax调用我需要执行。所以我做了类似的事情:

        var requests = [];

        if (weNeedCustomerData) {
            var customerCallPromise = $.ajax(...);
            requests.push(customerCallPromise);
        }
        if (weNeedOrdersData) {
            var ordersCallPromise = $.ajax(...);
            requests.push(ordersCallPromise);
        }
        if (weNeedSalesData) {
            var salesCallPromise = $.ajax(...);
            requests.push(salesCallPromise);
        }

        $.when.apply(null, requests).done(function (result1, result2, result3) {
            ...
        });

只要我的所有“if”条件都是真的,它就能正常工作。我可以得到每次通话的结果。

但是我应该如何处理这样的情况,例如,第一个“if”语句是假的,我最终只有两个请求?我在“完成”方法中只有两个结果。

如果我不知道会有多少请求,我怎么能读出这些结果,所以我不知道“完成”函数会有多少参数?

4 个答案:

答案 0 :(得分:2)

单独存储或处理结果:

    var requests = [], customerData, ordersData, salesData;

    if (weNeedCustomerData) {
        var customerCallPromise = $.ajax(...).done(function(result){
            customerData = result;
        });
        requests.push(customerCallPromise);
    }
    if (weNeedOrdersData) {
        var ordersCallPromise = $.ajax(...).done(function(result){
            ordersData = result;
        });
        requests.push(ordersCallPromise);
    }
    if (weNeedSalesData) {
        var salesCallPromise = $.ajax(...).done(function(result){
            salesData = result;
        });
        requests.push(salesCallPromise);
    }

    $.when.apply(null, requests).done(function () {
        //Here you know all relevant requests are complete
        if(customerData) {
            //...
        }
        //etc
    });

答案 1 :(得分:1)

嗯...我不确定我是否理解你的问题...但我认为你不知道有多少属性有.done()回调函数(result1,result2,result3,...)因为你不知道打印了多少条件。

你可以使用cicle检查回调函数的属性,如:

var requests = [];
var _y = 0;

    if (weNeedCustomerData) {
        var customerCallPromise = $.ajax(...);
        //i guess $.ajax() is sync not async for use this syntax and not put the request store inside of the success callback.
        requests[_y] = customerCallPromise;
        _y++;
    }
    if (weNeedOrdersData) {
        var ordersCallPromise = $.ajax(...);
        requests[_y] = customerCallPromise;
        _y++;
    }
    if (weNeedSalesData) {
        var salesCallPromise = $.ajax(...);
        requests[_y] = customerCallPromise;
        _y++;
    }

$.when.apply(null, requests).done(function () {
    if(arguments.lenght > 0){
         for(var _k = 0; _k < arguments.lenght; k++){
             //this log show you all arguments (result1,resut2,result3...ecc...) whitout you need to define all
             console.log(arguments[_k]);
         }
    }
});

但是现在我对ajax以及你用于evalue请求的方式有些困惑,因为如果$ .ajax是异步的,那么脚本不会等待salesCallPromise评估......但也许只是我的偏执< /强> ...

:)我希望它可以提供帮助。

答案 2 :(得分:0)

1 /这是一个棘手的问题。您可以控制此代码的服务器端部分,您可以放置​​标记/标记,从中可以获得服务器端操作方法。在客户端(javascript)中,您可以切换此标志/标记。  2 /另一种方式可能更合适的是在When.js文档中看到如何处理这种情况https://github.com/cujojs/when

答案 3 :(得分:0)

另一种方法是不使用$ .when - 明确$ .ajax调用并处理相应的响应;)