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()