【问题标题】:Assign data from jQuery getJSON to array将 jQuery getJSON 中的数据分配给数组
【发布时间】:2010-08-09 17:21:00
【问题描述】:

如何将通过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]); }); })
  • 是的,这与之前的帖子有关。但是,我最初过于简化了我的问题,所以提供的初始解决方案并没有解决它。 jQuery - getJSON data to array

【问题讨论】:

    标签: jquery getjson


    【解决方案1】:

    您的问题是,在收到$.getJSON 响应时,$.getJSON 请求之外(以及之后)的任何代码都已经运行。

    请记住,AJAX 调用是异步的。这意味着 AJAX 请求之后的代码不会等待响应执行。所以它在没有任何响应之前运行了很长时间。

    关键是任何依赖于来自异步 AJAX 请求的响应的代码都必须在回调中运行(或从中调用)。


    编辑:

    为了澄清,在下面的代码示例中,请参阅代码 cmets。它应该有助于解释问题。

    $(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 - 是的,当然。看这个例子:jsfiddle.net/FgV8W 如果你在 JSON 加载的时候点击这个值,你什么也得不到,如果你在加载完成后点击它,它会给你数据。
    • @ina - 它是否是全局的并不重要。如果您尝试使用它之前它有任何数据,那么它将是undefined。如果您立即尝试在$.getJSON 回调外部 使用haikus 变量,它将不起作用。使用haikus 的代码不会等待返回响应。它将尝试立即使用haikus。因为它不等待响应,所以haikus 尚未从响应中分配data
    • @Ryley 啊,我想我明白发生了什么 - 所以基本上在警报调用之前 json 还没有加载(?)推论问题 - 请参阅关于你的 jfiddle 的讨论 - jsfiddle.net/FgV8W
    • @ina - 没错。如果您还有其他问题,请在此处留下 cmets。
    【解决方案2】:

    我相信如果你使用'var haikus = something'定义一个变量,这个变量是局部范围的,如果你使用'haikus = something'定义一个变量,它是全局范围的。

    【讨论】:

    • 我敢肯定,简单地做 haikus=something 会给你一个 haikus 未定义的错误,要在全局范围内做,只需定义 var haikus = 任何函数之外的东西。
    • 啊啊啊!!所以我的问题与变量范围(doh)有关
    • 刚刚尝试在 readyfunction 之外声明 haikus=[] - 在 readyfunction 内部但在 getjson 外部的警报仍然返回 undefined...(甚至不会弹出)
    • @Razor - haikus=something 会给你一个全局变量。但是全局是不必要的,因为haikus 在适当的范围内。
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2011-03-27
    • 1970-01-01
    • 2016-11-26
    • 2016-06-13
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多