Promise.all如何不拋出異常等到所有的成員執(zhí)行完成

Promise.all如何不拋出異常等到所有的成員執(zhí)行完成

Promise.all的基本用法

Promise.all([promise1, promise2, promise3, ...])
  .then(res => {console.log(`res=${res}`)})
  .catch(err => {console.log(`err=${err}`)});

promise會(huì)等待所有的成員[promise1, promise2, promise3, ...]的結(jié)果:

  1. 如果所有成員都執(zhí)行完成resolved,那么執(zhí)行then分支
  2. 如果其中有任何一個(gè)成員失敗reject,那么執(zhí)行catch分支。

例如:

$ cat test.js 
'use strict';

const a = Promise.resolve(1);
const b = Promise.reject(2);
const c = Promise.resolve(3);

Promise.all([a,b,c])
  .then(res => {console.log(`res=${res}`)})
  .catch(err => {console.log(`err=${err}`)});

$ node test.js 
err=2

因?yàn)閜romise b返回了reject,那么Promise.all就執(zhí)行catch分支。

但是有些時(shí)候,我們希望能讓所有的promise都執(zhí)行完成,不管成功還是失敗,然后才繼續(xù)后面的操作。

解決辦法:

Promise.all([a,b,c].map(p => p.catch(e => {...})))
  .then(res => {...})
  .catch(err => {...});

其含義是說,如果任何promise遭遇reject,截獲這個(gè)異常,然后就可以不拋出異常了,此時(shí)可以把異常轉(zhuǎn)換為普通的輸出,然后在Promise.all().then(...)里面分析所有的輸出,從而再?zèng)Q定哪些是異常輸出,哪些是正常輸出。

例如:

$ cat test.js 
'use strict';

const a = Promise.resolve(1);
const b = Promise.reject(2);
const c = Promise.resolve(3);

Promise.all([a,b,c].map(p => p.catch(e => {console.log(`pe=${e}`); return 100})))
  .then(res => {
                console.log(`map res=${res}`);
                for (let i=0; i<res.length; ++i) {
                    if (res[i]) {
                        console.log(`map res[${i}]=${res[i]}`);
                    }
                }
  })
  .catch(err => {console.log(`map err=${err}`)});


$ node test.js
pe=2
map res=1,100,3
map res[0]=1
map res[1]=100
map res[2]=3

我們看到promise b拋出reject之后,這個(gè)exception被截獲了,并且把異常的內(nèi)容2改寫成100,然后在Promise.all().then(...)里面能夠讀取到這個(gè)100的值。此時(shí)then的邏輯就可以區(qū)分是否有異常產(chǎn)生了,即如果res的值大于100,就說明是個(gè)異常輸出,否則就是正常輸出。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,834評(píng)論 1 56
  • Promise對(duì)象是一種解決異步問題的方法,還有的解決方案是asyns 和 await (es7) 這么是目前的終...
    站在大神的肩膀上看世界閱讀 1,335評(píng)論 0 6
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,563評(píng)論 0 8
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,226評(píng)論 0 12
  • Promiese 簡(jiǎn)單說就是一個(gè)容器,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語法上說,Pr...
    雨飛飛雨閱讀 3,489評(píng)論 0 19

友情鏈接更多精彩內(nèi)容