當前位置:網站首頁>Promise.all 獲取失敗原因
Promise.all 獲取失敗原因
2022-01-26 22:35:05 【棠樾】
Promise.all()
接受一個由promise任務組成的數組,可以同時處理多個promise任務,當所有的任務都執行完成時,Promise.all()
返回resolve,但當有一個失敗(reject),則返回失敗的信息,即使其他promise執行成功,也會返回失敗。可以用一句話來說Promise.all()
,要麼全有要麼全無。
但話又說回來,有時候我們使用Promise.all()
執行很多個網絡請求,可能有一個請求出錯,但我們並不希望其他的網絡請求也返回reject,要錯都錯,這樣顯然是不合理的。
而我們需要的是即使有一兩個接口請求失敗,我們依然可以獲取到成功的接口請求數據。
那下面說說如何做才能做到promise.all中即使一個promise程序reject,promise.all依然能把其他數據正確返回。
首先我們先創建一個resolve和reject的promise函數
const promiseResove = (promiseResolveSecond = function(n=0){
return new Promise(function(resolve, reject){
setTimeout(function() {
resolve({
resolveAfterSeconds: n
})
}, n * 100);
})
})
const promiseReject = (promiseRejectSecond = function(n=0) {
return new Promise(function(resolve, reject) {
setTimeout(function () {
reject({
rejectAfterSeconds: n
})
}, n * 100)
})
})
使用上面的函數創建一個所有結果能正確返回的promise.all程序
var promiseArray = []
promiseArray.push(promiseResove(1))
promiseArray.push(promiseResove(3))
promiseArray.push(promiseResove(2))
var handlePromise = Promise.all(promiseArray)
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})
-
執行結果如下
然後在創建一個擁有reject函數返回的promise
var promiseArray = []
promiseArray.push(promiseResove(1))
promiseArray.push(promiseReject(3))
promiseArray.push(promiseResove(2))
var handlePromise = Promise.all(promiseArray)
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})
-
執行結果如下
當promise.all
中有一個promise執行失敗返回reject時,promise.all直接返回執行失敗的promise結果。
但我們還想看到其他兩個resolve的結果,所以後面用一個trick方法,來解决這個問題。
代碼修改如下
var promiseArray = []
promiseArray.push(promiseResove(1))
promiseArray.push(promiseReject(3))
promiseArray.push(promiseResove(2))
// 將傳入promise.all的數組進行遍曆,如果catch住reject結果,
// 直接返回,這樣就可以在最後結果中將所有結果都獲取到
var handlePromise = Promise.all(promiseArray.map(function(promiseItem) {
return promiseItem.catch(function(err) {
return err
})
}))
handlePromise.then(function(values) {
console.log('all promise are resolved', values)
}).catch(function(reason) {
console.log('promise reject failed reason', reason)
})
和之前唯一的不同就是在promise數組添加了一個回調函數,當數組中有接口reject時,catch住結果直接返回,這樣失敗的結果也可以當做成功處理,所以在promise.all中我們可以監聽到所有結果的返回,然後在針對不同的返回值進行處理。
原文鏈接:https://www.jianshu.com/p/3b42565e65ef
版權聲明
本文為[棠樾]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201262235052520.html
邊欄推薦
猜你喜歡
隨機推薦
- QT 項目的創建和運行
- QDialog、QWidget、QMainWindow的區別
- C#入門筆記
- Linux Mysql 數據庫用戶管理
- Placement service – placement安裝(wallaby-allinone)
- MySQL架構設計詳解
- 【正點原子FPGA連載】 第三十五章 基於OV7725的PL以太網視頻傳輸實驗-摘自【正點原子】領航者ZYNQ之FPGA開發指南_V2.0
- Openstackan實驗之glance組件安裝與配置
- 達人評測 realme Book 增强版 Air 怎麼樣
- Mysql存儲原理(2)
- 運動規劃和SLAM什麼關系?
- C#中int[] 轉 string[] 的代碼
- UiPath的許可查詢、激活、遷移和導出
- 再探 redis 分布式鎖
- 【2021最後一波官方福利】七天玩轉Redis | 打卡還能領周邊活動開始啦
- HLS編程入門
- 多線程的實現方式
- Shell編寫格式和執行方式
- 基於kubernetes的Prometheus監控mysql
- 什麼是光纖隔離器?
- @Inherit注解與注解的繼承
- 【C語言】從兩端向中間打印字符串
- 在txt中添加圖像路徑並將多個txt中的內容逐行拼接
- jupyter notebook代碼提示設置
- 頂級容器化技術
- 微服務服務拆分步驟(架構設計原則千萬條,高內聚低耦合第一條)
- 【BUG記錄】com.alibaba.nacos.api.exception.NacosException: Request nacos server failed
- 如果對象的引用被置為null,;垃圾回收器是否會立即釋放對象占用的內存?
- 使用Redis搭建電商秒殺系統
- 道與術
- 少兒消費型重疾目前那個比較好一點?有沒有推薦的產品
- 猪器官又立功了!移植轉基因猪腎給腦死亡病人,23分鐘後成功產生尿液
- Flink(50):Flink之綜合練習(二)
- 數組和鏈錶插入效率比較
- pytest-selenium demo
- [LeetCode]劍指 Offer II 038. 直方圖最大矩形面積
- jangow靶機滲透
- Vision Transformer(Pytorch版)代碼閱讀注釋
- 『淺入深出』MySQL 中事務的實現
- Redis 設計與實現:事務