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

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

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

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

Q&A

解決済

4回答

693閲覧

javascript async awaitに関して質問

Kimsehwa

総合スコア312

JavaScript

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

0グッド

0クリップ

投稿2019/11/09 15:31

関数B:
Promiseをリータンする

関数A:
関数Bのに渡す引数を取得できる関数(Promiseはリータンしない)

上記のような2つの関数があります。

関数AはPromiseはリータンしませんが、少し複雑です。(ロジックは長いので割愛)

関数BはPromiseをリータンするため、async awaitで同期的に受け取ろうしてます。
この場合、関数Bに渡す引数が取得できる関数Aはawaitにしなくても動作的に問題ないでしょうか?
テストでは問題ありませんでしたが、関数Aの実行時間が長くなると問題にならないか懸念してます。

現在作成してることは以下のとおりです。

const A = () => { return 12; }; const B = num => { return new Promise(resolve => { setTimeout(() => { resolve(`${num}つ目の処理`); }, 3000); }); }; (async () => { const hoge = A(); console.log(hoge); const res = await B(hoge); console.log(res); })();

result:

12 12つ目の処理

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

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

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

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

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

Kimsehwa

2019/11/10 08:54

ありがとうございます。解決にならなかった質問にはコメントするようにします
think49

2019/11/16 01:20

@Kimsehwa さん > 解決にならなかった質問にはコメントするようにします コメントされていないようです。
guest

回答4

0

ベストアンサー

同期処理は await があってもなくても動作は変わりません。

そして、「await でなければ、できない動作」も「Promise でなければ、できない動作」もありません。
パフォーマンスを求めるのなら、動作が単純化される分、どちらも使わない書き方をするのが最速と思われます。

Re: Kimsehwa さん

投稿2019/11/09 17:13

think49

総合スコア18166

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

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

0

問題があるかどうかは、その処理にどの程度時間がかかるかに依るのでは?
処理が複雑でも数ミリ秒で終わるなら問題になると思えないですが。
プログラム的に許容できないほど時間がかかるなら、そこで初めて非同期化するなど工夫する余地は出てくるだろけど、提示された条件で「問題ありますか?」という問に答えられるだけの材料がないため、回答不可能だと思いますが。

投稿2019/11/09 15:48

gentaro

総合スコア8949

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

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

gentaro

2019/11/09 15:50

せめてもうちょっと詳しい要件を書くか、問題が顕在化してから対処したらいいんじゃないですかね?
guest

0

関数Aはawaitにしなくても動作的に問題ないでしょうか?

関数Aの実装次第じゃないでしょうか。

関数内に擬似的に非同期を実現するsetTimeout()が使われる、あるいは Ajaxなど非同期関数の結果を待つ実装を含む場合は、関数AもPromiseを返却する形にして await を使う必要があります。
そうでなければ、完全な同期関数と捉えられるので問題ないといえます。

javascript

1// A(){ JavaScript関数になってなかったので訂正 2const A = () => { 3 4 // 複雑な実装 <<== これ次第 5 6 return hoge; // ここの返却タイミングに着目する。 7}

投稿2019/11/17 06:07

編集2019/11/17 06:23
AkitoshiManabe

総合スコア5432

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

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

0

課題はむしろAがpromiseを返す場合でしょうね

javascript

1const A = async()=>12; 2const B = num => { 3 return new Promise(resolve => { 4 setTimeout(() => { 5 resolve(`${num}つ目の処理`); 6 }, 3000); 7 }); 8}; 9(async () => { 10 var hoge=null; 11 await A().then(res=>{hoge=res}); 12 const res = await B(hoge); 13 console.log(res); 14})();

上記、A()をきちんとawaitすればresで「12つ目の処理」が表示されますが

javascript

1const A = async()=>12; 2const B = num => { 3 return new Promise(resolve => { 4 setTimeout(() => { 5 resolve(`${num}つ目の処理`); 6 }, 3000); 7 }); 8}; 9(async () => { 10 var hoge=null; 11 A().then(res=>{hoge=res}); 12 const res = await B(hoge); 13 console.log(res); 14})();

awaitしないと「nullつ目の処理」になります

投稿2019/11/11 00:54

yambejp

総合スコア114863

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

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

dameo

2019/11/11 01:36

パフォーマンス云々というより、Aの結果をBが必要とするなら、Aが終わってからでないとBを実行するわけには行きません。つまり、Aを非同期で実行して、仮にBと同時に動かすと、回答者さんの言う通り、大変な結果になる可能性があると思います。
think49

2019/11/11 03:51

@dameoさん パフォーマンス的には出力処理だけ後回しにすればいいので、BがAに先行して実行可能なケースもあると思います。 Promise.all がその典型ですね。 A(出力処理以外)+B(出力処理以外) ※順不同 -> A(出力処理) -> B(出力処理)
dameo

2019/11/11 03:56

関数A: 関数Bのに渡す引数を取得できる関数 とあったので、Bの実行に先立って結果が必要なのではないかと考えました。 解釈の違い?なのかな。よく分かりません。
think49

2019/11/11 04:01

@dameoさん ごめんなさい。読み直してみると、確かにそう読めますね。 Aが同期/非同期のどちらか、が重要な判断要素ですね。
yambejp

2019/11/11 04:03 編集

そもそもがAはpromsieでも非同期でもないので本題については Bのawaitは不要で、同期的処理は担保されているという認識でよいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問