違いは何ですか
return await foo()
そして
const t = await foo();
return t
基本的に、return await
は冗長です。
async
関数を実際に使用する方法の少し高いレベルから見てください:
const myFunc = async () => {
return await doSomething();
};
await myFunc();
async
関数はすでにPromise
を返すため、Promise
として(直接Promise
として、またはawait
- ing。
関数の内部でawait
を使用すると、外部の関数も何らかの方法でawait
するため冗長です。したがって、単にPromise
を送信しない理由はありません。外側のものに対処させてください。
構文的に間違っていたり間違っていたりすることはなく、通常は問題を引き起こしません。これは完全に冗長なため、リンターがトリガーします。
_return await
_を使用すると、Node.jsで使用されるv8エンジン、Chromeおよび他のいくつかのブラウザーで新たに導入された利点があります。
v8では_--async-stack-traces
_フラグが導入され、V8 v7.3ではデフォルトで有効になっています(Node.js v12.0.0)。
このフラグは、エラースタックプロパティを非同期関数呼び出しスタックトレースで強化することにより、開発者のエクスペリエンスを向上させます。
_async function foo() {
return bar();
}
async function bar() {
await Promise.resolve();
throw new Error('BEEP BEEP');
}
foo().catch(error => console.log(error.stack));
Error: BEEP BEEP
at bar (<anonymous>:7:9)
_
return bar();
foo()
関数呼び出しを呼び出すと、エラースタックに関数呼び出しがまったく表示されないことに注意してください。これをreturn await bar();
に変更すると、はるかに優れたエラースタック出力が得られます。
_async function foo() {
return await bar();
}
Error: BEEP BEEP
at bar (<anonymous>:7:9)
at async foo (<anonymous>:2:10)
_
これは確かにはるかに優れたエラースタックトレースを提供するため、常に約束を待つことを強くお勧めします。
さらに、async/waitは手書きの約束を上回るようになりました。
_
async/await
_は、手書きのpromiseコードよりも優れています。ここで重要なことは、非同期関数のオーバーヘッドを大幅に削減したことです。V8だけでなく、すべてのJavaScriptエンジンで、仕様にパッチを適用することでオーバーヘッドを削減しました。 ソース
これらの変更の詳細については、v8.devブログをご覧ください。 https://v8.dev/blog/fast-async#improved-developer-experience
ただできるから
async function() {
return foo();
}
async function
の返される結果は、関数本体内の正確な値または別のPromise
オブジェクトを返すかに関係なく、常にPromise
です。