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



我有一个简单的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");
 });

每次当我执行上面的调用时,我大多会收到失败警报。只有有时我收到成功提示。

但是当我不同时在$中调用超过2个时。什么时候,我就会always get Success alert.

谁能帮我找出我在上面的代码片段错了吗?或者我必须使用另一种方法才能使上述函数正常工作

问题是你强迫jQuery使用一个特定的JSONP回调函数名称,callback,通过这个选项:

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

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


在下面的评论中你说:

当我删除jsopcallback参数时,我在浏览器中收到这个错误:ReferenceError: callback没有定义

当你删除jsonpCallback: 'callback'参数时你看到的是:

<>之前回调({"状态":0,"项":20,"内容":[{"不丹":196年,"new2":1、"new3":2,"new4":"abcd"、"new5":41岁的"new6":"aadsa ", } ] }

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

标准参数名是callback,例如:

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

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

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

如果你调用那个端点,你需要ajax上的jsonp: 'mySpecialCallbackArg'选项。


在进一步的评论中,你说你不能指向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可以为每个调用提供一个独特的函数,并且它们不会相互踩在一起。

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

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

最新更新