fはasync関数だとして、以下は同じですか?
JavaScript
1async g(){ 2 return f() 3} 4 5async g(){ 6 return await f() 7}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア320
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。