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

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

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

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

Q&A

解決済

1回答

707閲覧

await が思っている通りに動かない!?

iBETA

総合スコア43

JavaScript

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

0グッド

0クリップ

投稿2021/07/18 07:02

以下のソースですが、僕の想定では、実行結果が
AAA
ZZZ
なはずだったのですが、
ZZZ
AAA
と出てしまいます。

Test.test();のところを
await Test.test();としてみたところ
AAA
ZZZ
という結果にはなりましたが納得できてません。

fetchメソッドやjsonメソッドを実行する際
awaitを付加したので、testメソッドを実行する際は
awaitは必要ないのではないかとの考察でした。
どなた様かご教授ください。よろしくお願いします。

JavaScript

1#!/usr/bin/node 2import fetch from 'node-fetch'; 3 4class Test { 5 6 static async test() { 7 8 let value = null; 9 10 const response = await fetch( 11 'https://www.google.com/' 12 ); 13 if (response.ok) { 14 value = await response.json(); 15 console.log('AAA'); 16 } 17 18 } 19 20} 21 22Test.test(); 23console.log('ZZZ');

RESULT

1ZZZ 2AAA

補足情報

node.js: v16

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

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

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

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

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

hentaiman

2021/07/18 07:21

質問者自身で確認した通りですが、何を教えて欲しいのでしょう?
iBETA

2021/07/18 07:28

なぜ Test.test(); のところで await Test.test(); にしないと期待通りにならないのかが知りたいです。 fetch()やjson()はプロミスを返すだけということで await を付加しました。 故に、非同期で動く箇所はなくなったのかと思ったのですが間違ってましたでしょうか。 よろしくお願いします。
guest

回答1

0

ベストアンサー

理解する上で重要なのは非同期関数の最初に書かれている文章の

結果として暗黙の Promise を返します。

の一文です

返されるのがPromiseなのでawaitしない場合の動作が質問者の想像と違ったんです

質問文のコードで気になるのはトップレベルawaitが機能している点ですが、nodejsの仕様で対応してるんですかね?
ブラウザだとasyncfunction内でしかawaitは動きません

投稿2021/07/18 07:44

hentaiman

総合スコア6421

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

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

iBETA

2021/07/18 08:33

動いてしまっているので トップレベルawait に関しては機能しているのだと思います。 node.js の最新版だからかなと。。。 >暗黙の Promise を返します。 そうだったんですね。知識不足でした。 もしそうなら確かにawaitをつけないと同期にはならないですよね でもawaitを使うなら、今回はトップレベルでの await Test.test(); でいいですが もしメソッド内ならそのメソッドにもasyncを書かないのだめなのですよね!? そうするとそのメソッドもreturnがあれば、またプロミスを返すことに。。。 で、あってましたでしょうか!? 何かいいアイデア等あれば教えていただけませんでしょうか どうぞよろしくお願いします。
hentaiman

2021/07/18 09:40

どういう点で心配してるのか分かりませんけど、ネストし過ぎてよく分からなくなるのが心配って事でしょうか? そしたら闇雲にプログラムを作る段階は終了で設計しながら(脳内設計しながら)見通しの良いファイル構成ディレクトリ構成モジュール構成関数設計クラス設計を頑張る段階ではないかと思います > もしメソッド内ならそのメソッドにもasyncを書かないのだめなのですよね!? そうですね、それもリンク先に書いてあるので一度リンク先のURLのものだけで良いので全文読んでみてください 自分も分からない事がある時はそういうサイト読んでます
iBETA

2021/07/18 23:03

>ネストし過ぎてよく分からなくなるのが心配って事でしょうか? はい。おっしゃる通りです。 >ファイル構成ディレクトリ構成モジュール構成関数設計クラス設計を頑張る段階ではないか なるほどですね。わかりました。 昨日今日とGOOGLE検索してみたのですが、これだという奴がみつからなくて困っています。 どこかしら、参考になるいいWEBサイト等あれば教えてはいただけないでしょうか。 async対策的なサイトであれば助かります。どうぞよろしくお願いいたします。m(_ _)m
hentaiman

2021/07/19 12:27 編集

nodejsの事詳しくないので分かりませんが、githubにたくさんソース転がってるから頑張って色々読んでみてはどうですか? 読み易い教科書に載ってそうな「こういうパターン」ってのを探してるならまず見つからないでしょうから、nodejs方面のガチプロ技術者に師事するしかないと思います と言っても独り立ち出来るだけの能力のある技術者雇うのは月80~100万ぐらい掛かるから現実的にはnodejs使う現場に就職する事ぐらいかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問