如何在jQuery中存储JSON响应?

我想将我的json响应存储在一个全局变量中,因此,我可以通过我的应用程序使用它,而不会多次发出getJSON请求。

var data; $.getJSON("panorama.json",function(json){ data = json.images[0].src; console.log(data); }); console.log(data); 

如果我在实际请求中记录它很好,但我在其他地方得到“未定义”。 任何评论都是适用的。

编辑[从评论中复制]:试过……

 $.myglobals = { result: "unset" } $(document).ready(function() { $.getJSON( "panorama.json", function(json) { $.myglobals.result = json.images[0].src; console.log($.myglobals.result); }); console.log($.myglobals.result); }) ; 

第一个日志没问题,第二个日志未定义。

编辑[从答案中复制]:

实际上两种方法都有效

有趣的是,我的请求是在一个函数中,我试图在同一函数中的请求后立即访问我的全局变量

当我在function之外加入它时,它就像一个魅力

如果您的真实代码结构如此,那么您在尝试访问尚未设置的数据时遇到问题。 仅仅因为你的$.getJSON()高于console.log()并不意味着你在记录数据值之前得到了响应。

所以你的问题不是范围,而是时间:引入一些服务器端延迟,你的解决方案也可能崩溃。

如果收到回复,也许你应该设置一些标志:

 var data, dataReceived = false; $.getJSON("panorama.json",function(json){ data = json.images[0].src; dataReceived = true; console.log(data); }); // somwhere later if (dataReceived) { console.log(data); } else { // you could use setTimeout() or setInterval here to re-check console.log("data not received yet"); } 

您可以将其插入DOM中的属性(例如#ID)并根据需要进行检索。

这是一种方法,允许您将变量设置在一个$(document).ready()中,并在另一个$(document).ready()中使用它。 myglobals是一个命名空间对象,它可以减少你的全局变量与其他人碰撞的可能性,特别是如果你把它命名为比“myglobals”更聪明的东西。

 $.myglobals = { result: "unset" } $(document).ready(function() { function pretend_JSON_call() { $.myglobals.result = {'a':"hello", 'b':"world" }; } pretend_JSON_call(); }); $(document).ready(function() { alert($.myglobals.result['a']); alert($.myglobals.result['b']); }); 

在jsbin中的上述代码的瞬态链接 。

$ .getJSON触发ajax请求(问题范围内的关键字是异步的)。您的变量未定义,因为尚未定义,响应尚未完成。 其他人建议在你的代码中进一步调低console.log,但除非你的逻辑与回调函数同步,否则不能保证它是可用的。 $ .getJSON接受回调函数作为其参数之一。

 $.getJSON( "myData.json", function( data ) { //Do whatever, this is a callback $.each( data, function(key, val) { //You can get even more specific like so }); });