我想将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);
}) ;
第一个日志没问题,第二个日志未定义。
编辑[从答案中复制]:
实际上两种方法都有效
有趣的是,我的 请求是在一个功能,我试过 正确访问我的全局变量 在同一函数中的请求之后当我在功能之外加入它时 它就像一个魅力
答案 0 :(得分:8)
如果您的真实代码的结构类似,那么您在尝试访问尚未设置 的数据时遇到问题。仅仅因为$.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");
}
答案 1 :(得分:1)
您可以将其插入DOM中的属性(例如#ID)并根据需要进行检索。
答案 2 :(得分:0)
这是一种方法,允许您将变量设置在一个$(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中的上述代码。
答案 3 :(得分:0)
$ .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
});
});