2013-09-27 67 views
0

我正嘗試將JSON文件讀入全局數組對象中。代碼的工作原理除了我似乎無法找到一種方法將數據從Ajax $ .getJSON調用中移出到全局變量中。也許這是因爲範圍和或同步。將JSON文件讀入全局對象數組 - 範圍和同步問題

我已經嘗試了幾種方法,我用下面的代碼在一個JSON文件中讀取(見Using Jquery to get JSON objects from local file):

var questions = {}; 

$(document).ready(function() { 

    readJsonFile().done(function (questions) { 
     // This outputs the array of objects (questions) OK -> 
     console.log("Questions read from JSON file: " + questions); 
    }); 

    // Cannot read from the array here 
    console.log("Question 1: " + questions[0].question); 

...

function readJsonFile() { 
    return $.getJSON("questions.json").then(function (data) { 
     // This was in the original post and didn't seem to return the array 
     // return data.items; 
     return data; 
    }); 
}; 

回答

1

第一個控制檯日誌輸出回調的參數。第二個輸出全局對象。他們之間沒有任何聯繫,除了他們有相似的名字。你應該這樣做:

readJsonFile().done(function (data) { 
     questions = data; // <- assigned the return data to the global object 
     // This outputs the array of objects (questions) OK -> 
     console.log("Questions read from JSON file: " + questions); 
    }); 
+0

謝謝。但是,在調用readJsonFile之外輸出問題[0] .question時,我仍然會'無法讀取屬性'問題'。同樣在控制檯窗口中,此錯誤在Ajax調用完成之前出現。這是由於異步加載? – wanwu

+0

是的。第二個控制檯日誌在Ajax調用完成後立即執行,在響應返回之前執行,因此在執行回調之前。 – Tibos

+0

我意識到的解決方案是使用對$ .ajax()的調用並確保async:false已設置。 – wanwu

0

好的。我計算出如何做到這一點......要加載JSON文件同步使用下面的代碼:

function readJsonFile() { 
    $.ajax({ 
     type: 'GET', 
     url: 'questions.json', 
     dataType: 'json', 
     success: function(data) { 
      questions = data; 
     }, 
     async: false 
    }); 
}; 

這個函數的調用後,我的全局變量「問題」是訪問,因爲回調等待,直到響應完成了。很明顯,如果Ajax調用不成功,你會想要做一些錯誤檢查。