我有一个简单的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'
参数时你看到的是:
这意味着你正在交谈的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是异步的。