4

您如何将通过获取的数据分配给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 数据到数组
4

2 回答 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]);

});
于 2010-08-09T17:53:41.000 回答
0

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

于 2010-08-09T17:25:08.837 回答