8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaScript: Promise.raceのどれかがエラーになったらどうなるか?

Posted at

JavaScriptのPromise.raceは2つ以上のPromiseに対して、早く完了したものを戻り値として得られる関数です。

もし、Promise.raceで競争するPromiseのうち、どれかがエラー(reject)になったら、どうなるのでしょうか? これについて検証してみます。

早いほうがエラーになった場合

下のサンプルコードでは、2つのPromiseが競争します。

ひとつは、100ミリ秒後にエラーになるPromise。もうひとつは、200ミリ秒後に成功裏に完了するPromiseです。

この2つのPromiseをPromise.raceで処理すると、前者のエラーのほうが勝ち、new Error('100ミリ後にエラーになった処理')のほうが戻り値になります。

async function test1() {
  // 100ミリ後にエラーになる処理
  const willError = new Promise((_, reject) =>
    setTimeout(() => reject(new Error('100ミリ後にエラーになった処理')), 100),
  )

  // 200ミリ秒後に完了する処理
  const willSuccess = new Promise(resolve =>
    setTimeout(() => resolve('200ミリ後に完了した処理'), 200),
  )

  try {
    await Promise.race([willError, willSuccess])
  } catch (error) {
    console.log(error.message)
    //=> "100ミリ後にエラーになった処理"
  }
}

test1()

遅いほうがエラーになる場合

今度は、エラーのほうが遅い場合です。

ひとつめのPromiseは、100ミリ秒後に成功裏に完了します。もうひとつは、200ミリ秒後にエラーになるPromiseです。

この2つのPromiseをPromise.raceで処理すると、前者のほうが勝ち、戻り値としては文字列の'100ミリ後に完了した処理'になります:

async function test2() {
  // 100ミリ秒後に完了する処理
  const willSuccess = new Promise(resolve =>
    setTimeout(() => resolve('100ミリ後に完了した処理'), 100),
  )
  
  // 200ミリ後にエラーになる処理
  const willError = new Promise((_, reject) =>
    setTimeout(() => reject(new Error('200ミリ後にエラーになった処理')), 200),
  )

  const result = await Promise.race([willSuccess, willError])
  console.log(result)
  //=> "100ミリ後に完了した処理"
}

test2()
8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?