2017-07-10 4 views
1

I私はこののJavaScript JSONの解析は、undefinedを返します

console.log(getSetting('restaurant_name')); 

のようにテストしてい以下の機能

function getSetting(item) { 
    var rawFile = new XMLHttpRequest(); 
    rawFile.overrideMimeType("application/json"); 
    rawFile.open("GET", "settings.json", true); 
    rawFile.onreadystatechange = function() { 
     if (rawFile.readyState === 4 && rawFile.status == "200") { 
      var data = JSON.parse(rawFile.responseText); 
      return data.item; 
     } 
    } 
    rawFile.send(null); 
} 

それは未定義

データのはconsole.logを返すされていは、JSONファイルのJSONオブジェクトを期待どおりに返します。

項目戻る予想通りRESTAURANT_NAMEのにconsole.log。

私は明白な何かを見逃しているに違いありませんが、私はまだ何も出くわしていないこれに関するStackoverflowの他のトピックを見ている。

私は結果を得るためにデータ[0] .itemを使用しようとしましたが、違いはありませんでした。 settings.jsonファイルの

内容:

{ 
    "restaurant_name": "Example_Restaurant_Name", 
    "restaurant_address": "Example Restaurant, England" 
} 

ヘルプくらい、事前に感謝を感謝しています。あなたのコードは、JSONのitem名前を探していると、ある

+0

非同期関数は何も返さず、代わりに約束とコールバックを処理する方法を学習する必要があります。 – webdeb

+0

@ webbdeb - ありがとう。私は前にwmorrellの例としてコールバックを持っていました。データ[item] _vs_ data.itemは何らかの理由でdata.itemを参照してJSON値を取得した例で私を捨てました。 – Laplant1

答えて

2
  1. あなたは、オブジェクト参照の間違ったフォームを使用しています。
  2. あなたの関数が非同期要求から直接戻る方法はありません。

代わりにこれを試してみてください:

function getSetting(item, callback) { 
    var rawFile = new XMLHttpRequest(); 
    rawFile.overrideMimeType("application/json"); 
    rawFile.open("GET", "settings.json", true); 
    rawFile.onreadystatechange = function() { 
     if (rawFile.readyState === 4 && rawFile.status == "200") { 
      var data = JSON.parse(rawFile.responseText); 
      callback(data[item]); // <----- THIS LINE CHANGES 
     } 
    } 
    rawFile.send(null); 
} 

getSetting('restaurant_name', function (value) { console.log(value); }); 
+1

はい、 'getSetting(item、callback)'のような2番目の引数を提供し、その使い方を説明します。 – webdeb

+0

Doh、それを完全にスキップして、私は含めて編集します。 – wmorrell

+0

ありがとう、これは働いた。 – Laplant1

0

私はこの問題は、return文であると考えています。

return data.item 

これは何をしたいことは、アイテム変数に格納されたキーとデータオブジェクトに値を返すとき、キー「アイテム」のデータオブジェクトに値を返すようにしようとするつもりです。

私はあなたが何をしたいの正しい構文があると思う:

return data[item] 

私もあなたがここにあなたの関数から値を返すことができるとは思わない - ので、あなたはコールバック関数を定義するか必要があります非同期要求が値を返すか、関数の外部にスコープされた変数を設定します。

誰かがコールバック関数を使用した回答を投稿したばかりだから、そのアプローチを使用することをお勧めします。

+0

スティーブン、ありがとう。 – Laplant1

関連する問題