将jQuery getJSON中的数据分配给数组

将jQuery getJSON中的数据分配给数组,jquery,getjson,Jquery,Getjson,如何将通过getJSON()获取的数据分配给数组,以供以后使用 下面的getJSON url检索格式正确的JSON,其中包含10个主要元素,每个元素都有id、username、haiku(和其他)子元素。如果您正在运行它,请尝试将JSON元素保存到本地文件中,这样就不会出现相同的域错误(即,如果您从不同的域获取,则不会加载JSON) 发生的情况是,警报将在getJSON回调中获取一个值,但在回调之外,该值未定义 $(document).ready(function(){ var hai

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

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

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


$(document).ready(function(){
    var haikus=[];
    alert("begin loop");
    $.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]);
    });
})

$(文档).ready(函数(){
var haikus=[];
警报(“开始循环”);
$.getJSON('http://example.com/json.php,函数(数据){
var i=0;

对于(i=0;i我认为,如果您使用'var haikus=something'定义变量,那么该变量属于局部范围;如果您使用'haikus=something'定义变量,那么该变量属于全局范围。

您的问题是任何外部(以及之后)的代码在收到
$.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]);

});
$(文档).ready(函数(){
var haikus=[];
警报(“开始循环”);
$.getJSON('http://haikuennui.com/random.php,函数(数据){
var i=0;

对于(i=0;我非常确定简单地执行haikus=something会给您一个haikus未定义的错误,要在全局范围内执行,只需在任何函数之外定义var haikus=something。啊哈!!所以我的问题与变量作用域(doh)有关,只是尝试声明haikus=[]readyfunction外部-readyfunction内部和getjson外部的警报仍然返回未定义…(更确切地说,甚至不会弹出)@Razor-
haikus=something
将为您提供一个全局变量。但是,由于
haikus
在适当的范围内,因此不需要全局变量。是的,但是如果在回调中填充一个全局数组,您可以稍后引用该数组吗?@ina-当然可以。请参见此示例:如果在加载JSON时单击该值,则我什么也得不到,如果你在它完成后单击它,它会给你数据。@ina-它是否是全局的并不重要。如果你试图在它有任何数据之前使用它,那么它将是未定义的。
如果你立即尝试在
$.getJSON
回调之外使用
haikus
变量,它将不起作用k、 使用
haikus
的代码不会等待响应返回。它会立即尝试使用
haikus
。因为它不会等待响应,那么
haikus
将不会被分配响应中的
数据。@Ryley-ahh我想我知道发生了什么-所以基本上不会在警报被称为(?)推论问题之前,他还没有加载json-请参阅关于JFIDLE-@ina的讨论-这是正确的。如果您还有其他问题,请在此处留下评论。