通过嵌套的延迟AJAX调用循环

时间:2015-01-19 10:52:16

标签: jquery ajax

我正在执行$.ajax(type: 'GET', data: ticket),其中ticket是身份验证令牌。获得ticket是这样的:

var newTicket = $.ajax({
                type: 'POST',
                dataType: 'jsonp',
                jsonp: 'callback',
                jsonpCallback: 'JsonPCallBack',
                data: {},
                url: "https://api.examample.com?username=bar&password=foo",
        });

获得ticket后,我可以执行GET

function getData(ticket, query) {
            return $.ajax( {
                type: 'GET',
                dataType: 'jsonp',
                jsonp: 'callback',
                jsonpCallback: 'JsonPCallBack',
                data: ticket,
                url: "https://api.examample.com/?data=" + query,
            });
        } 

把它放在一起:

        newTicket.done(function(ticket) {

            var ticket = ticket;
            getData(ticket, query).done(function(result) {

                console.log(result);

            }); 
        });

这完全没问题 - 我的两个电话肯定有​​效。

我的挑战是,我希望再次为query的许多值进行此调用。这是我试过的:

// example.com promises me that I can use ticket for multiple requests
// for one ticket I will try and do multiple requests

newTicket.done(function(ticket) {

    var deferred = $.Deferred();
    var ticket = ticket;

    // Inspired by http://stackoverflow.com/questions/5627284/pass-in-an-array-of-deferreds-to-when
    requests = [];

    for (i in queries) {
        query = queries[i];
        requests.push(getData(ticket, query));
    }

    $.when.apply($, requests).done(function(result) {
        for(var i = 0; i < arguments.length; i++) {
            console.log(calculateData(arguments[i][0]));
        }
    });

});

然而,这不起作用。我无法弄清楚为什么。有什么建议吗?

我尝试添加此代码:

.fail(function(jqXHR, textStatus, errorThrown) {
            console.log('jqXHR: ' + jqXHR);
            console.log('textStatus: ' + textStatus);
            console.log('errorThrown: ' + errorThrown);
        });

这给了我:

jqXHR: [object Object]
textStatus: parsererror
errorThrown: Error: JsonPCallBack was not called

更新 如果我没有指定jsonp和JsonPCallBack,那么只有一个请求的简单情况不起作用。如果我指定jsonp和JsonPCallBack它确实有效。

我尝试在我的数组中运行带有两个请求的代码。嗅探数据包我看到两个请求是使用状态代码200确定的。响应以JsonPCallBack({开头,包含正确的数据。因此,当我看到实际的回复时,一切看起来都是正确的。为什么我会到达.fail()

2 个答案:

答案 0 :(得分:0)

问题在于您对所有请求使用单个回调。您应该删除jsonpCallback: 'JsonPCallBack'并让服务器使用回调参数,如clientCallBack +“(”+ json +“)”

答案 1 :(得分:0)

jsonpCallback参数指示用于包装JSONP响应的函数名称。 jQuery自动设置一个具有此名称的函数,该函数等待被调用,以便可以处理返回的数据。

您正在为此参数指定显式值,这意味着所有请求将等待相同的函数名称,而所有的响应将尝试调用相同的函数名称,它将完全混乱。无法正确路由响应。

因此,不要指定该参数或jsonp参数。除非有特殊原因,否则建议不要使用它们。

作为旁注,可以简化生成请求数组的代码:

var requests = $.map(queries, function (query) {
    return getData(ticket, query);
});