将jQuery的getJSON返回值赋值给数组

4

如何将通过getJSON()获取的数据分配给数组以备后用?

下面的getJSON url检索格式正确的JSON,其中有10个主要元素,每个元素都有id、username、haiku(和其他)子元素。如果您正在运行它,请将JSON元素保存到本地文件中,这样就不会出现相同的域错误(即,如果您从不同的域获取,则不会加载JSON)。

发生的情况是,在getJSON回调内部,警报将获取一个值,但在外部,该值未定义。


$(document).ready(function(){
    var haikus=[];
    alert("开始循环");
    $.getJSON('http://example.com/json.php',function(data){
         var i=0;
         for(i=0;i<data.length;i++){
            haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)];
        }
            alert(haikus[0][1]);
    });
})

2个回答

20
你的问题在于任何位于 $.getJSON 请求之外(和之后)的代码在收到 $.getJSON 响应时已经执行完毕。请记住,AJAX 调用是异步的。这意味着 AJAX 请求后面的代码不会等待响应来执行。因此,在响应之前它就已经运行了很长一段时间了。关键在于任何依赖于异步 AJAX 请求响应的代码必须在回调函数内运行(或从中调用)。

编辑:

为了澄清,在下面的代码示例中,请查看代码注释。它应该有助于解释这个问题。

$(document).ready(function(){
    var haikus=[];
    alert("begin loop");
    $.getJSON('http://haikuennui.com/random.php',function(data){
         var i=0;
         for(i=0;i<data.length;i++){
            haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)];
        }
                 // The data in haikus is available here becuase
                 //    this alert() doesn't run until the response is received.
            alert(haikus[0][1]);
    });

         // Here the data in haikus is NOT available because this line
         //     of code will run ***before*** the response from the AJAX
         //     request from above is received.
         // In other words, this alert() executes **immediately** without
         //     waiting for the $.getJSON() to receive its response.
    alert(haikus[0][1]);

});

是的,但如果您在回调函数中填充全局数组,那么以后可以引用该数组吗? - ina
2
@ina - 当然可以。请看这个例子:http://jsfiddle.net/FgV8W/ 如果你在JSON加载时点击该值,你将得到空白,如果你在加载完成后再点击它,它将给你你的数据。 - Ryley
@ina - 这并不重要是变量是否为全局。如果你在它有任何数据之前尝试使用它,那么它将是“未定义”的。如果你立即尝试在$.getJSON回调函数外部使用haikus变量,它将无法工作。正在使用haikus的代码不会等待*响应返回。它将尝试立即使用haikus。因为它不等待响应,所以haikus还没有被分配来自响应的data - user113716
@Ryley 啊,我想我明白发生了什么 - 基本上是在警报被调用之前没有加载JSON (?) 相关问题 - 请参见您的jfiddle上的讨论 - http://jsfiddle.net/FgV8W/ - ina
@Ryley 谢谢!我现在对 J/S Json/Ajax 数据流有更好的理解了!(顺便说一下,我只是用 random.php 作为多样化 Json 元素的简单来源。你能将它改成 http://exampler.com/json.js 吗?) - ina
显示剩余2条评论

0

我相信如果你使用“var haikus = something”来定义一个变量,那么这个变量是局部作用域的;而如果你使用“haikus = something”来定义变量,那么它就是全局作用域的。


我非常确定仅仅做 haikus=something 会导致一个 haikus 未定义的错误,要在全局范围内执行它,只需在任何函数之外定义 var haikus = something。 - Razor Storm
啊啊啊!!我的问题与变量作用域有关(哎呀) - ina
刚刚尝试在ready函数外声明haikus=[],但是在getJSON之外的alert仍然返回未定义...(实际上,甚至没有弹出) - ina
@Razor - haikus=something 将会给你一个全局变量。但是由于 haikus 已经在正确的作用域内,因此全局变量不必要。 - user113716

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接