javascript - 加载本地 .json 文件时,jQuery $.when().done() 无法按预期使用 JSONP

标签 javascript jquery ajax json jsonp

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

最佳答案

问题在此处指定:

ReferenceError: callback is not defined

您的 JSONP 响应有回调硬编码。这是不正确的。 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 可能不喜欢对多个请求使用相同的回调值。

关于javascript - 加载本地 .json 文件时,jQuery $.when().done() 无法按预期使用 JSONP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690929/

相关文章:

php json_encode 没有返回正确的 json 编码字符串

javascript - 我如何将此 AJAX json 结果(具有键/值属性)转换为 javascript 数组

javascript - 将电子邮件数据绑定(bind)到 mailto 链接 json

javascript - 在 div 之间切换 div 类(jquery、javascript)

javascript - 修复 CSS 3d 立方体旋转中的翻译

javascript - 导航至 Bootstrap 步骤向导中的任何步骤

php - 通过ajax获取Select标签值

javascript - Websocket 跨页面 JavaScript

javascript - 动态添加、验证和删除表单字段集

javascript - 在 ng-model 之后填充 ng-options