如何在JQuery中存储JSON响应?

问题描述:

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

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


console.log(data); 

如果我在实际的请求中记录它的罚款,但我得到“未定义”的其他地方。 任何评论appriciated。

编辑[从评论复制]:试了...

$.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); 
}) ; 

第一个日志是好的,第二个是不确定的。

编辑[从答案复制]:

实际上两者方法奏效

有趣的是,我的 请求是一个功能,我试图 进入电影我的全局变量后右 请求在同一功能

当我在功能外面加上它 它像一个魅力

+0

我不知道你是否正在访问你的全局变量之前,它得到更新?从JQuery示例中:注意:请记住,该函数之后的那些行将在回调之前执行。 – 2009-06-19 21:28:11

+0

你可能是正确的更新,但我怎么能告诉我的全局变量是否已经更新?或者我应该在哪里放我的请求,以便在我使用它之前更新我的全局变量,我唯一能想到的就是在请求的回调中写入所有内容,但这听起来很傻:) – soda01 2009-06-19 21:43:29

如果您的真实代码是这样构建的,那么您在尝试访问尚未设置的数据时遇到问题尚未。仅仅因为您的$.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)并根据需要检索它。

+0

我想如果它是可以的,一个简单的字符串,但实际上它是一个巨大的JSON对象 – soda01 2009-06-19 21:01:14

这是一种让您在一个$(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']); 
}); 

Transient link以上代码在jsbin中。

+0

$ .myglobals = { 结果: “未设置” } $(文件)。就绪(函数(){ $ .getJSON( “panorama.json” 功能(JSON){ \t \t \t \t \t \t \t \t \t \t \t \t \t \t $ .myglobals.result = json.images [0] .src; \t \t \t \t console.log($。myglobals.result); \t \t \t }); \t \t \t \t \t \t console.log($。myglobals.result); }) 第一个日志是好的,但第二个是仍不明确 – soda01 2009-06-19 20:39:08

$ .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 
    }); 
});