2012-05-22 51 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");(並填充數組)。提示這是正在發生的事情是,你的輸出你看之前「內部」