4

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

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

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

编辑[从答案复制]:

实际上这两种方法都有效

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

当我在功能之外访问它时,它就像一个魅力

4

4 回答 4

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");
}
于 2009-06-19T21:45:19.910 回答
1

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

于 2009-06-19T18:21:29.757 回答
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']);
});

jsbin 中上述代码的临时链接

于 2009-06-19T18:23:57.833 回答
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
    });
});
于 2013-10-09T13:13:54.073 回答