我正在使用Sammy和Knockout构建SPA,该服务由不同URL上提供的REST Web服务提供支持。
在使用$.when().done()
时返回JSONP与JSON时,我注意到一些奇怪的行为......
.done()
永远不会触发,但是.fail()
会,即使我收到的状态代码是200,JSONP Linter告诉我我的JSONP有效:
(function($) {
$(function() {
$.when($.getJSON('endpoint1?callback=?', null),
$,getJSON('endpoint2?callback=?', null))
.done(function(resp1, resp2) {
console.log(resp1); // this is never called
});
})
.fail(function(obj) {
console.log(obj); // this is called, but why?
});
});
})(jQuery);
返回的样本回复是:
callback({
"external-links": [
{
"nav_link_text": "Stack Overflow",
"url": "http://stackoverflow.com"
}
]
});
如果我返回JSON而不是JSONP,.done()
按预期工作。我做错了什么或需要改变什么?
答案 0 :(得分:1)
问题在这里指定:
ReferenceError:未定义回调
您的JSONP响应已callback
进行了硬编码。那是不对的。 JSONP需要动态设置函数名称。
当jQuery发送JSONP请求时,它会创建一个名为jQuery123456
的函数(或类似的东西),并在请求中发送该名称。它调用endpoint1?callback=jQuery123456
。 JSONP的工作是调用那个函数。您的JSONP需要返回:
jQuery123456({
your: 'data'
})
您需要使用callback
参数的值。
如果由于某种原因,“动态”创建JSONP不是一个选项,您可以强制jQuery命名它创建的回调函数。您需要使用$.ajax
:
$.ajax({
url: 'endpoint1',
dataType: 'jsonp',
jsonp: false, // Don't add the "?callback=?" param,
// you're not using it anyway
jsonpCallback: 'callback' // Force jQuery to use "callback"
// as the function name
});
注意:jQuery可能不喜欢为多个请求设置相同的回调值。