web-dev-qa-db-ja.com

なぜno-return-await vs const x = await?

違いは何ですか

return await foo()

そして

const t = await foo();
return t

http://eslint.org/docs/rules/no-return-await

18
peppydip

基本的に、return awaitは冗長です。

async関数を実際に使用する方法の少し高いレベルから見てください:

const myFunc = async () => {
  return await doSomething();
};

await myFunc();

async関数はすでにPromiseを返すため、Promiseとして(直接Promiseとして、またはawait- ing。

関数の内部でawaitを使用すると、外部の関数も何らかの方法でawaitするため冗長です。したがって、単にPromiseを送信しない理由はありません。外側のものに対処させてください。

構文的に間違っていたり間違っていたりすることはなく、通常は問題を引き起こしません。これは完全に冗長なため、リンターがトリガーします。

25
samanime

_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

10
Bamieh

ただできるから

async function() {
  return foo();
}

async functionの返される結果は、関数本体内の正確な値または別のPromiseオブジェクトを返すかに関係なく、常にPromiseです。

6
edvard chen