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

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

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

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

Q&A

解決済

1回答

4280閲覧

returnでawaitしてもしなくてもいいのか

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

1クリップ

投稿2021/06/13 12:58

fはasync関数だとして、以下は同じですか?

JavaScript

1async g(){ 2 return f() 3} 4 5async g(){ 6 return await f() 7}

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

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

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

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

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

m.ts10806

2021/06/13 20:31

「同じ」の基準は? 実際に実行してみればわかることでは。
guest

回答1

0

ベストアンサー

回答する前に、Javascriptにおいて、非同期関数(async function)の書き方が若干違いいますね。

js

1async function g(){ 2 return f() 3} 4 5async function g(){ 6 return await f() 7}

さて、上記2つの書き方の違いはreturn f()return await f()です。この書き方の違いによってどう、機能的な違いがあるかですが、回答としては、完全に同じではないですが、ほぼ違いはありません。エラー処理によって差異が生まれます。

Javascriptにおいて、async functionは、Promiseオブジェクトを返す関数です。

javascript

1async function afunc(){ return value; }

と書くと、async functionの返り値は、暗黙的にPromise.resolveでラップされます。

javascript

1function afunc(){ return Promise.resolve(value); }

Promise.resolveは与えられたオブジェクトがPromiseであれば、そのままそのオブジェクトを返し、そうでなければPromiseオブジェクトに変換して返します。

一方awaitはPromiseが成功する時の値を返します。つまり

javascript

1const a = await promise; 2b(a);

と書けば、

javascript

1promise.then(a=>{ b(a) });

とほぼ同じになり、つまりpromiseが成功した時のPromise.thenコールバックの引数に与えられるオブジェクトがそのまま、返されるというわけです。

これをらを見ていくと、

javascript

1async function g1(){ 2 return f() 3} 4 5async function g2(){ 6 return await f() 7}

は、このように書き換えることができ

javascript

1function g1(){ 2 return Promise.resolve(f()); 3} 4 5function g2(){ 6 return f().then(x=>Promise.resolve(x)); 7}

の違いとなり、return f()はf()で帰ってきたPromiseをそのまま返し、return await f()は、f()で帰ってきたPromiseの成功したオブジェクトを取り出し、それをPromiseオブジェクトに変換していると言えます。

よってreturn f()return await f()はPromiseは同じ成功した値を持つPromiseを返すので、「ほとんど一緒」と言えるわけです。

じゃあ、どこで違いが出るか?と言えば、エラー処理で出てきます。

たとえば、

js

1async function g_fail1(){ 2 try{ 3 return f(); 4 }catch(error){ 5 return null; 6 } 7} 8 9async function g_fail2(){ 10 try{ 11 return await f(); 12 }catch(error){ 13 return null; 14 } 15}

と書けば、g_fail1の方は、失敗したPromiseオブジェクトであっても、エラーを捕捉することができず、一方、g_fail2の方であれば、失敗したPromiseオブジェクトのエラーを補足することが可能です。

このような違いがあります。また、細かいことですが、マイクロタスクが発生するかしないかで若干、実行速度が違うようです。

投稿2021/06/13 16:03

nobkz

総合スコア320

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問