【问题标题】:Please explain this mysterious $.getJSON behaviour请解释这个神秘的 $.getJSON 行为
【发布时间】:2013-07-20 08:53:31
【问题描述】:
var test = $.getJSON( 'data/mydata.json' );

console.log( test );
console.log( JSON.stringify(test) );

第一条日志语句输出:

第二行输出:

{"readyState":1}

我的数据发生了什么变化?我真的必须传递一个函数才能获取 responseJSON(请注意,我不是在处理生产代码)?

但最重要的是,这可能吗?如果我愿意,我不知道该怎么做。

【问题讨论】:

  • Ajax 代表异步。是的,设计模式暗示你必须给它一个回调。在那里,您只需阅读一些文件,因此速度足够快。但是 $.getJSON 返回一个类似 jQuery xhr 的对象。不是您的数据。

标签: javascript json jquery firebug


【解决方案1】:

test 这里是jQuery XHR 对象,而不是您返回的数据。要获取您返回的数据,请尝试:

$.getJSON( 'data/mydata.json' ,function(data){
     console.log( data);
     console.log( JSON.stringify(data) );
});

或者更推荐的方式:

$.getJSON( "data/mydata.json").done(function(data) { 
     console.log( data);
     console.log( JSON.stringify(data) );
});

从 jQuery 1.5 开始,所有 jQuery 的 Ajax 方法都返回一个超集 XMLHTTPRequest 对象。这个 jQuery XHR 对象或“jqXHR” $.getJSON() 返回的实现 Promise 接口,给它 Promise 的所有属性、方法和行为(参见 Deferred 对象以获取更多信息)。 jqXHR.done() (成功), jqXHR.fail()(用于错误)和 jqXHR.always()(用于完成,是否 成功或错误)方法采用函数参数,当 请求终止。有关这些论点的信息 函数接收,请参阅 $.ajax() 的 jqXHR 对象部分 文档。

jQuery 1.5 中的 Promise 接口还允许使用 jQuery 的 Ajax 方法, 包括 $.getJSON(),链接多个 .done()、.always() 和 .fail() 对单个请求的回调,甚至分配这些 请求完成后的回调。如果请求是 已经完成,立即触发回调。

Documentation

【讨论】:

  • 是的,我知道,但是为什么 firebug 可以访问这些属性,而我不能在 javascript 中访问这些属性?我只是讨厌内联函数范式,即使在您给出的示例中,我仍然很难在外部范围内的变量中获取数据(我想我需要克隆它)
  • @nus: how comes firebug can access these properties while in javascript I can't 你尝试了什么?记住 $.getJSON 是异步的,所以如果你尝试在之后立即访问返回的数据,数据可能还没有到达
  • 对最后的评论感到抱歉。显然我不能将它转储到外部作用域的变量中,因为它是异步的。我只是对萤火虫的输出感到困惑。 firebug 是不是人为地把 jqXHR 对象放在一起?
  • @nus 这些属性可供您访问,就像它们对 Firebug 一样 -- test.responseText。您的代码和 Firebug 之间的区别在于时间。如果不使用回调,您的代码将立即期待它。另一方面,Firebug 稍等片刻,让请求有时间完成。
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多