通過promise等方式實(shí)現(xiàn)
- 先來鞏固下promise.all()
Promise.all可以將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例傀缩。同時(shí)后德,成功和失敗的返回值是不同的,成功的時(shí)候返回的是一個(gè)結(jié)果數(shù)組栖雾,而失敗的時(shí)候則返回最先被reject失敗狀態(tài)的值楞抡。
- 問題來了,上面所說的析藕,若有一個(gè)請(qǐng)求失敗召廷,則會(huì)直接返回失敗的值,那怎么保證不管請(qǐng)求是否成功账胧,最終都返回有序的值呢竞慢?
1、方案一:對(duì)每個(gè)請(qǐng)求進(jìn)行catch錯(cuò)誤捕獲治泥,如下:
const list = [this.getFun(),this.getFun1(),this.getFun2()]
// const res = await Promise.all(list) 將此行代碼改寫成下方代碼:
//catch錯(cuò)誤筹煮,直接return空值
const res = await Promise.all(list.map(item=> item.catch(err => '')))
2、方案二:使用es11中的promise.allSettled
新增的方法居夹,不管請(qǐng)求列表返回的結(jié)果是rejected還是fulfilled败潦,都會(huì)返回相應(yīng)的狀態(tài)和結(jié)果值。
- 額外補(bǔ)充ES12新增的promise方法
promise.any
方法准脂,異步方法一旦有一個(gè)是fulfilled狀態(tài)劫扒,就會(huì)返回這個(gè)結(jié)果,如果都為rejected狀態(tài)狸膏。則catch到第一個(gè)err粟关,并告知all promise were rejected