2016-09-11 9 views
0

この質問は何度も尋ねられました。それでも、私はそれを作成する関数の範囲外に読み込まれたオブジェクトを取得する方法を理解していません。私は明らかに動作していない第二にconsole.logのmyArrで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 

行う場合は特に

は、そのurlキーはそれは未定義です!

myArrをその外で利用できるようにするにはfunction?私はjQueryのを使用しないしたい可能であれば

FYI JSONは

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

です。

+0

この質問は、jQueryについてのものです。 「同期」要求の問題は同じように見えます。 –

答えて

0

プロパティurlは未定義ですので読むことができます。配列にアクセスしようとすると、未定義です。配列 "myArr"はまだ空です。非同期にXMLHttpRequestを使用しているため、ブラウザは応答を待たずに次のコマンドを実行します。あなたは、コールバック関数を使用するかに

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

変更shulde:

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)のチュートリアルのように処理を進めると、私は読み込みます私はそれを処理する必要があるたびにファイル...非常に効率的ではありません。 –

関連する問題