一樣是多個 promise 並行,但只會等待第一個 settled promise 的結果或錯誤。
以這個例子來說,第一個 promise 最快完成,所以最終得到的結果是 1:
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
實務上 (原來) 可以用這個方法來限制請求的時間,如來自這個問題中的例子,用一個計時器和請求比賽哪一個會先完成,代表請求時間如果超過就會送出 timeout 錯誤:
var p = Promise.race([
fetch('/resource-that-may-take-a-while'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
])
p.then(response => console.log(response))
p.catch(error => console.log(error))
同一篇問題的回答中還有一個實例,是以 Promise.race
來控管並行 promise 數量,可以參考。
類似 Promise.race
,但只等待第一個 fulfilled promise 的結果。如果所有的 promise 都失敗,會以 AggregateError
錯誤物件 reject,這個物件當中的 errors
屬性會有所有 promise 的錯誤。
下方的例子第一個完成的 promise 失敗,所以會得到第二個 promise 的結果:
Promise.any([
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 1000)),
new Promise((resolve, reject) => setTimeout(() => resolve(1), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
Promise.any
也是比賽的概念,並且若有的任務先失敗,還是能得到成功結果。另外它也可以用在取任意較快結果 (例如下載或引入資源) 的情境。