首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery $.when().done()在加载本地.json文件时不按预期在JSONP中工作

jQuery $.when().done()在加载本地.json文件时不按预期在JSONP中工作
EN

Stack Overflow用户
提问于 2013-10-30 18:23:49
回答 1查看 1.3K关注 0票数 1

我正在使用Sammy和Knockout构建一个SPA,该服务由不同URL上可用的REST Web服务提供。

当使用$.when().done()返回JSONP和JSON时,我注意到了一些奇怪的行为.

.done()从不触发,但是.fail()会触发,尽管我收到的状态代码是200,JSONP Linter告诉我JSONP是有效的:

代码语言:javascript
复制
(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);

返回的示例答复如下:

代码语言:javascript
复制
callback({
    "external-links": [
        {
            "nav_link_text": "Stack Overflow",
            "url": "http://stackoverflow.com"
        }
    ]
});

如果我返回JSON而不是JSONP,.done()将按预期工作。我做错了什么或者需要改变什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-30 19:38:32

这里具体说明了这个问题:

ReferenceError:未定义回调

您的JSONP响应有callback硬编码。那是不正确的。JSONP需要动态设置函数名。

当jQuery发送JSONP请求时,它会创建一个名为jQuery123456的函数(或类似的函数),并在请求中发送该名称。它叫endpoint1?callback=jQuery123456。JSONP的工作是调用该函数。您的JSONP需要返回:

代码语言:javascript
复制
jQuery123456({
    your: 'data'
})

您需要使用callback参数的值。

如果出于某种原因,“动态”创建JSONP不是一个选项,则可以强制jQuery命名它创建的回调函数。为此,您需要使用$.ajax

代码语言:javascript
复制
$.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可能不喜欢对多个请求具有相同的回调值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19690929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档