【问题标题】:jQuery JSONP - error with a callback outside done()jQuery JSONP - 外部回调错误 done()
【发布时间】:2013-09-20 21:48:33
【问题描述】:

我正在使用 jQuery 1.8.2,并且正在执行这样的 JSONP 调用:

    function foo(data) {
      console.log(data)
    }

    $.ajax({
      type: 'GET',
      url: http://xxx.cloudfront.net/posts.json?category=News&callback=foo,
      dataType: 'jsonp',
      cache: true,
      jsonp: false
    }).done(function (data) {

    }).fail(function (XHR, status, error) {
      console.log(error);
    });

当我运行它时,正确的数据响应会返回到 foo 回调。但是该错误也会触发,并且控制台将错误记录为Error {}。从 Stackoverflow 上的其他地方阅读看来,这是因为响应包含在回调中,并且 jQuery 期望纯 JSON。我应该忽略这个错误吗?

【问题讨论】:

  • promise 不可能同时触发 donefail 处理程序。
  • 它似乎没有触发完成 - 但响应作为参数传递给 foo()。
  • 查询字符串参数如何被用作函数调用???
  • @AndFinally:你为什么使用foo 函数而不是done 回调?
  • @Bergi 我现在知道这是错误的!

标签: jquery ajax json jsonp


【解决方案1】:

您不应该有一个作为回调的全局函数foo,而是自动将let jQuery create that global function 传递给done 回调。它确实希望调用自己的函数,否则会触发错误。

$.ajax({
  type: 'GET',
  url: "http://xxx.cloudfront.net/posts.json?category=News&callback=?",
  dataType: 'jsonp',
  jsonpCallback: 'foo', // for caching
  cache: true
}).done(function (data) {
  console.log(data);
}).fail(function (XHR, status, error) {
  console.log(error);
});

【讨论】:

  • 很好地了解foo 函数。
  • 谢谢Bergi - 当我按照你的建议重写它时,它会很有效。
  • 嗯,我的同事刚刚告诉我,我们指定了自己的回调,因为我们需要缓存响应。
  • @AndFinally:您可以为此使用jsonpCallback 参数。
【解决方案2】:

您已从 AJAX 调用中专门删除了 JSONP 回调,尝试从传递给 $.ajax 的选项对象中省略 jsonp : false,然后删除您创建的回调函数 (foo) 并让 jQuery 执行为你工作。

可在此处找到文档:http://api.jquery.com/jquery.ajax/

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 2014-02-05
    • 2012-02-16
    • 1970-01-01
    • 2012-07-31
    • 2011-10-11
    • 2013-01-28
    • 2011-01-13
    相关资源
    最近更新 更多