2016-09-11 134 views
0

我知道這個(或類似的)問題已被詢問了很多次。我仍然不明白如何讓加載的對象超出創建它的函數的範圍。使用XMLHttpRequest將JSON文件加載到全局範圍內的Javascript數組中

特別是如果我做

var xmlhttp = new XMLHttpRequest(); 
var url = "lineJSON.json"; 
var myArr= new Array(); 

xmlhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 
     myArr = JSON.parse(this.responseText); 
     console.log(myArr[0].url); //here it give the right output 
    } 
}; 
xmlhttp.open("GET", url, true); 
xmlhttp.send(); 
console.log(myArr[0].url); // Cannot read property 'url' of undefined 

在第二的console.log myArr,該顯然是不能工作的,其url關鍵是不確定的!

如何在function之外提供myArr

FYI的JSON是

[ 
{ 
"display": "JavaScript Tutorial", 
"url": "http://www.w3schools.com/js/default.asp" 
}, 
{ 
"display": "JavaScript Tutorial", 
"url": "http://www.w3schools.com/js/default.asp" 
} 
] 

如果可能的話,我想不使用jQuery。

+0

這個問題應該是一個重複的問題,關於jQuery。 「同步」請求的問題似乎是一樣的。 –

回答

0

您可以閱讀屬性url,因爲它是未定義的。它是不確定的,當你嘗試訪問它時,數組「myArr」仍然是空的。您異步使用XMLHttpRequest,因此瀏覽器不會等待響應並執行下一個命令。您shulde使用回撥功能或者改變

xmlhttp.open("GET", url, true); 

到:

xmlhttp.open("GET", url, false); 

但它不是最好的解決辦法。當請求出現錯誤時,整個腳本將被停止。

+0

感謝您指出異步含義。事實上,我檢查它與同步工作,但我想探索回調選項。謝謝 –

+0

順便說一句,我不知道有很多解決方法可以做到同步,也許我錯了。我正在嘗試加載JSON以使代碼瞭解其中存在哪些鍵,並使用這些鍵名填充(搜索)表單。如果我確實需要製作表單,那麼文件必須已經加載......我是否錯過了JS的邏輯? –

+0

此外,我的代碼將JSON加載到一個對象中,這會使其內容一勞永逸地進行進一步處理。另一方面,按照[http://www.w3schools.com/json/json_http.asp](http://www.w3schools.com/json/json_http.asp)上的教程進行處理,可以讓我加載該文件每次我必須處理它...不是非常有效。 –

相關問題