sample()のjsoninfoにデータを入れたいのですが、loadJson()の箇所でjsonに値が入る前にreturnされてしまうので、jsonInfoに値が入っていない状況です。
処理が終わってからreturnされるのが理想なんですが、どう記述すればいいか教えて頂きたいです。
非同期処理についてasync/awaitの使い方が分かっておらず、、、
javascript
1 function info(obj){ 2 var location = obj.sample1.value.id; 3 var user = obj.sample1.value.user; 4 return { 5 "location": location, 6 "user" : user 7 } 8 } 9 10 function loadJson() { 11 var json; 12 $.getJSON("data.json", function(data) { 13 var obj = data[0]; 14 json = info(obj); 15 console.log(json); //値が入っている、2番目に表示される 16 }); 17 console.log(json); //undefined、1番目に表示される 18 return json; 19 } 20 21 function sample(){ 22 var jsonInfo = loadJson(); 23 }
json
1[ 2 { 3 "id": "1232", 4 "template": { 5 "value": "タイトル" 6 }, 7 "sample1": { 8 "value": { 9 "user": { 10 "value": 50 11 }, 12 "id": { 13 "value": 1231 14 } 15 } 16 } 17 } 18]
async/awaitを使ったもの
javascript
1 2 async function loadJson() { 3 var json; 4 $.getJSON("data.json", function(data) { 5 var obj = data[0]; 6 json = await info(obj); 7 console.log(json); //値が入っている 8 }); 9 console.log(json); //undefined 10 return json; 11 }
実際のjsonデータはありませんか?
すいません、編集しました。
ここでの問題点は、$_.getJSON が非同期処理をしているため、それが終わる前に console.log(json) が呼ばれていて、json にはまだデータが入っていないということです。getJSON が終わるまで待機しなければいけません。
https://stackoverflow.com/questions/42675535/how-to-make-the-getjson-wait-before-running-the-rest-of-the-code
このベストアンサーの二番目のコードのように getJSON を呼び出す処理を関数に独立させ、Promise を返し、それを await すると良いでしょう。
ただし await するためには呼び出し側も非同期関数である必要があります。
async function sample(){
var jsonInfo = await loadJson();
}