0

我有一个简单的 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 个时,我总是会收到 Success 警报。

谁能帮我找出我在上面的代码片段中哪里错了?或者我必须使用另一种方法来使上述功能正常工作。

4

2 回答 2

2

问题是您callback通过以下选项强制 jQuery 使用特定的 JSONP 回调函数名称:

jsonpCallback: 'callback'

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

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


在下面的评论中你说过:

当我删除 jsopCllback 参数时,我在浏览器 ReferenceError 中收到此错误:未定义回调

并且当您删除jsonpCallback: 'callback'参数时您看到的是:

回调({“状态”:0,“项目”:20,“内容”:[{“新1”:196,“新2”:1,“新3”:2,“新4”:“abcd”,“新5” :41,“新6”:“aadsa”,}]}

这意味着您正在与之交谈的 JSONP 服务使用非标准查询字符串参数名称作为名称来提供回调,因此它忽略了 jQuery 使用的标准名称。您必须找出他们期望回调名称的参数名称,并jsonp: 'argNameTheyUse'使用ajax.

标准参数名称是callback,例如:

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

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

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

如果您正在调用该端点,则需要jsonp: 'mySpecialCallbackArg'ajax.


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

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

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

...将生成响应的代码foo用作 JSONP 回调名称:

foo({
   "data": "here"
})

如果查询是:

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

然后bar改用:

bar({
   "data": "here"
})

这样,当您进行多次重叠调用时,jQuery 可以为它们中的每一个赋予一个独特的功能,并且它们最终不会互相踩踏。

如果由于某种原因您不能这样做(?!),那么您将不得不连续(一个接一个)而不是并行进行调用。

于 2013-05-17T09:41:26.400 回答
-1

它可能会发生,因为您正在并行调用多个 ajax 调用并且 ajax 是异步的。

于 2013-05-17T09:47:30.237 回答