2012-05-22 52 views
2

我想在我的JavaScript对象中创建一个数组,其中包含使用jQuery中的$ .getJSON()函数从JSON文件中拉入的对象。我遇到了范围问题,看起来数组元素是在$ .getJSON()函数中设置的,但在它之外,数组是空的。下面是代码:在JavaScript对象的范围问题

function player(playlist){ 
... 
var tracks = []; 

this.start = function() { 
... 
    $.getJSON(playlist, function(data){ 
     $.each(data.tracks, function(key,value){ 
      var track_info = function(info){return info}(value); 
      tracks.push(track_info); 
     }); 
     console.log("from .getJSON function"); 
     console.log(tracks); 
    }); 
    console.log("outside .getJSON function"); 
    console.log(tracks); 
    ... 
}; 
... 
$(document).ready(function(){ 
    var the_player = new player(playlist); 
    the_player.start(); 
)}; 

输出是:

outside .getJSON function 
[] 
from .getJSON function 
[Object, Object, Object] 

而且所有的对象包含从JSON文件的正确数据。

我对这个问题感到困惑,有人能帮我理解吗?

回答

4

的提示“外”是为了:

outside .getJSON function 
[] 

其次

from .getJSON function 
[Object, Object, Object] 

你的外代码在获得JSON响应之前正在执行,因此不足为奇,tracks为空。这看起来可能与直觉相反 - from .getJSON function首先出现在源代码中,但是正在执行第二个!这是因为.getJSON不同步。在继续下一个陈述之前,它不执行它的回调参数。它立即继续到下一个语句,并稍后执行回调。

+0

啊!这就说得通了!那么在继续使用代码之前,有没有一种好的方法可以让.getJSON完成?我应该从.getJSON调用中调用下一个代码吗? – DorkRawk

+1

@DorkRawk:“我应该从.getJSON调用中调用下一个代码吗?” - 在一个! – Eric

1

$ .getJSON是一个AJAX调用,并且是异步的。这意味着在您的AJAX调用返回之前调用console.log("outside .getJSON function");(并填充数组)。提示这是正在发生的事情是,你的输出你看之前“内部”