iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
自我挑戰組

JS 加強筆記系列 第 17

Day 17:promise 方法 (2)

  • 分享至 

  • xImage
  •  

Promise.race

一樣是多個 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.any

類似 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 也是比賽的概念,並且若有的任務先失敗,還是能得到成功結果。另外它也可以用在取任意較快結果 (例如下載或引入資源) 的情境。


上一篇
Day 16:promise 方法 (1)
下一篇
Day 18:Promise.all 與 Promise.allSettled 實例
系列文
JS 加強筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言