使用jQuery延迟方法$ .when进行多个jsonp Ajax调用

时间:2013-05-17 09:36:48

标签: jquery ajax jsonp

我有一个简单的ajax函数:

function GetJsonData(api) {

 return (
 $.ajax({
 type: 'GET',
 jsonpCallback: 'callback',
 url: api,
 dataType: 'jsonp'

 }));
}

现在当我尝试做这样的多个调用时:

 $.when(
 GetJsonData("api"),
 GetJsonData("api"),
 GetJsonData("api"),
 GetJsonData("api"),
 GetJsonData("api")
 )
 .done(function (data1, data2, data3, data4, data5) {
 alert("success");

 })
 .fail(function () {
 alert("fail");
 });

每当我像上面那样打电话时,我大多都会收到失败警报。只要 有时我得到成功警报。

但是当我在$ .when中同时不超过2个电话时,我会 总是得到成功警报。

有人可以帮助我找出上面代码片段中的错误吗?或者我 必须使用另一种方法使上述功能正常工作。

2 个答案:

答案 0 :(得分:2)

问题是你强迫jQuery使用特定的JSONP回调函数名callback,并使用此选项:

jsonpCallback: 'callback'

因此,如果您有重叠的JSONP调用,jQuery将尝试使用页面上的相同的函数来处理每个函数的结果,并在完成其作业请求后删除该函数。这显然是一个问题,请求互相攻击。

删除该选项并允许jQuery创建自己的函数名称。它将确保函数名称对每个请求都是唯一的。


在下面的评论中你说过:

  

当我删除jsopCllback参数时,我在浏览器Referencem中发现此错误:未定义回调

当您删除jsonpCallback: 'callback'参数时,您看到的内容是:

callback( { "status": 0, "item": 20, "contents": [ { "new1": 196, "new2": 1, "new3": 2, "new4": "abcd", "new5": 41, "new6": "aadsa", } ] }

这意味着您正在谈论的JSONP服务使用名称的非标准查询字符串参数名称来提供回调,因此它忽略了jQuery使用的标准名称。您必须找出他们期望回调名称的参数名称,并使用jsonp: 'argNameTheyUse'的{​​{1}}选项。

标准参数名称为ajax,例如:

http://example.com/getsomething?callback=foo

...表示使用回调名称callback。但是一些API使用不同的参数,例如:

http://example.com/getsomething?mySpecialCallbackArg=foo

如果您呼叫该端点,则需要foo上的jsonp: 'mySpecialCallbackArg'选项。


在进一步的评论中,你说你不能指向API文档,因为它是“私有的”。如果它是“私有”,就像你或你公司所控制的那样,那么很好,修复它以便它尊重ajax查询字符串参数并将其用作JSONP响应中的函数名。这就是JSONP的工作方式。

例如,如果您发送此请求:

http://example.com/getsomething?callback=foo

...让生成响应的代码使用callback作为JSONP回调名称:

foo

如果查询是:

http://example.com/getsomething?callback=bar

然后使用foo({ "data": "here" }) 代替:

bar

这样,当你进行多次重叠调用时,jQuery可以为每个调用提供一个独特的函数,并且它们最终不会互相踩踏。

如果由于某种原因你不能那样做(?!),那么你必须连续(一个接一个)串联你的电话。而不是并行。

答案 1 :(得分:-1)

可能会发生这种情况,因为您并行调用多个ajax调用,而ajax是异步的。