質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

4316閲覧

async/await で処理を待ちたい。

shohei000

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/05/27 19:04

駅データ.jp(API)の情報を取得した後に処理を実行したいのですが、
取得する前に実行されてしまうので、取得を待ちたいです。

javascript

1 let xml = {}; 2 let group_data = []; 3 function getGroup(code){ 4 let s = document.getElementsByTagName("head")[0].appendChild(document.createElement("script")); 5 s.type = "text/javascript"; 6 s.charset = "utf-8"; 7 s.src = `http://www.ekidata.jp/api/g/${code}.json`; //駅グループJSONデータURL 8 // s.src = "http://www.ekidata.jp/api/g/1130224.json"; //サンプルコード 9 let str = ""; 10 xml.onload = function(data){ 11 let station_g = data["station_g"]; 12 if(station_g != null){ 13 for( i=0; i< station_g.length; i++){ 14 group_data.push({'code':station_g[i].line_cd,'name':station_g[i].line_name}); 15 } 16 } 17 } 18 } 19 $(function(){ 20 $('body').on('click','.searchTrigger',(e) => { 21 const target = $('#ekiInput').val(); 22 const code = data[target]; 23 getGroup(code); 24 console.log(group_data) 25 }); 26 });

現在
console.log(group_data)
をすると空の配列が出力されてしまう。
xml.onload を待ちたいのですが、
うまくいきません。。。

async/awaitを使ってなんとかすることは可能なのでしょうか。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/05/27 20:25

これ全部コード貼ってますか?抜粋ですか? このコードだけだとイマイチ何で悩んでおられるのかわかりません。書かれたとおり動いてると思います。 このコードを見る限り、xmlという名の空オブジェクト(何らかのプロトタイプを継承しているコードもない)に「xml.onload というメソッドを追加している」だけで、「メソッドの呼び出し」すらしていないので、group_data配列が空なのは当たり前だと思います…。 async/await以前の問題の気がしますので、JavaScriptの基本的な部分をもうちょっと学ばれるべきかと思います。
otolab

2019/05/27 21:02

ホントダ
guest

回答1

0

jsの仕様上、処理を待つことはできない(同期化)んですが、処理が完了したときに次の処理を実行することならできます。

js

1function f() { 2 return new Promise((resolve, reject) => { 3 asyncFunction((data) => { 4 resolve(data) 5 }) 6 }) 7} 8 9function run() { 10 f.then((data) => { 11 console.log(data) 12 }) 13}

こんなかんじ。これをasync, awaitで書くと、

js

1async function f() { 2 return new Promise((resolve, reject) => { 3 asyncFunction((data) => { 4 resolve(data) 5 }) 6 }) 7} 8 9async function run() { 10 const data = await f() 11 console.log(data) 12}

こうなります。

元のコードと対応を取ると、

js

1 asyncFunction((data) => {

これと

js

1xml.onload = function(data) {

これが対応する感じです。

投稿2019/05/27 20:16

編集2019/05/27 20:18
otolab

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/05/27 20:51

ええ?これそういう問題なんですか? 処理を待つことができない、って、そもそもconsole.log()の呼び出しまでの一連の処理の中に非同期処理が存在しないんだから、元コードだと1ステップずつちゃんと待ってますよね…。
otolab

2019/05/27 20:57

> console.log()の呼び出しまでの一連の処理の中に非同期処理が存在しない xml.onloadの部分は非同期処理じゃないですか?なんか読み間違えてるかしら。
miyabi_takatsuk

2019/05/28 02:16 編集

横槍失礼します。 質問修正依頼拝見しました。 gentaroさんの言う通り、xmlの処理がそもそもおかしい感じですね・・・。 質問者さんは、XMLHttpRequestを入れているつもりなのだとは思いますが、エスパーですね 汗 ----- 下記元コメント ----- otolabさんの見解で合っていると思いますよ。 元コードの、 getGroupメソッドでは、xml.onload内で、外部スコープのgroup_data配列変数に値をプッシュしてますので、 xml.onloadイベントの処理を待たずに、 getGroup呼び出しの次ステートメントの、 console.logの処理が実行されてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問