我正在执行$.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()
?
答案 0 :(得分:0)
问题在于您对所有请求使用单个回调。您应该删除jsonpCallback: 'JsonPCallBack'
并让服务器使用回调参数,如clientCallBack +“(”+ json +“)”
答案 1 :(得分:0)
jsonpCallback
参数指示用于包装JSONP响应的函数名称。 jQuery自动设置一个具有此名称的函数,该函数等待被调用,以便可以处理返回的数据。
您正在为此参数指定显式值,这意味着所有请求将等待相同的函数名称,而所有的响应将尝试调用相同的函数名称,它将完全混乱。无法正确路由响应。
因此,不要指定该参数或jsonp
参数。除非有特殊原因,否则建议不要使用它们。
作为旁注,可以简化生成请求数组的代码:
var requests = $.map(queries, function (query) {
return getData(ticket, query);
});