1. ホーム
  2. javascript

[解決済み] return await promise`と`return promise`の違いについて

2022-04-24 01:29:23

質問

以下のコードサンプルで、動作に違いはありますか?あるとすれば、それはどのような違いですか?

return await promise

async function delay1Second() {
  return (await delay(1000));
}

return promise

async function delay1Second() {
  return delay(1000);
}

私の理解では、1つ目は非同期関数内でエラー処理が行われ、エラーは非同期関数のPromiseからバブルアウトされるでしょう。しかし、2番目は1回少ないtickを必要とします。これは正しいのでしょうか?

このスニペットは、参照用のPromiseを返す一般的な関数に過ぎません。

function delay(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

解決方法は?

の間に観察可能な差がないことがほとんどです。 returnreturn await . どちらのバージョンも delay1Second は観察可能な動作が全く同じです(ただし、実装によっては return await を使用するため、若干多くのメモリを消費する可能性があります。 Promise オブジェクトが作成される可能性があります)。

ただし、@PitaJ さんのご指摘の通り、1つだけ違いがあるケースがあります。 return または return await がネストしている try - catch ブロックを作成します。この例について考えてみましょう。

async function rejectionWithReturnAwait () {
  try {
    return await Promise.reject(new Error())
  } catch (e) {
    return 'Saved!'
  }
}

async function rejectionWithReturn () {
  try {
    return Promise.reject(new Error())
  } catch (e) {
    return 'Saved!'
  }
}

最初のバージョンでは、非同期関数が結果を返す前に拒否されたプロミスを待っているため、拒否が例外になり catch このため、この関数は文字列 "Saved!" に解決されるプロミスを返します。

しかし、この関数の2番目のバージョンは、拒否された約束を直接返します。 非同期関数の中で待たずに ということは catch ケースは ない が呼び出され、呼び出し元は代わりに拒否を取得します。