我正在使用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()将按预期工作。我做错了什么或者需要改变什么?
发布于 2013-10-30 19:38:32
这里具体说明了这个问题:
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可能不喜欢对多个请求具有相同的回调值。
https://stackoverflow.com/questions/19690929
复制相似问题