加载本地.json文件时,jQuery $ .when()。done()与JSONP无法正常工作

时间:2013-10-30 18:23:50

标签: javascript jquery ajax json jsonp

我正在使用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()按预期工作。我做错了什么或需要改变什么?

1 个答案:

答案 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可能不喜欢为多个请求设置相同的回调值。