Promise.all 處理error

Promise.all()接受一個(gè)由promise任務(wù)組成的數(shù)組,可以同時(shí)處理多個(gè)promise任務(wù),當(dāng)所有的任務(wù)都執(zhí)行完成時(shí),Promise.all()返回resolve,但當(dāng)有一個(gè)失敗(reject),則返回失敗的信息,即使其他promise執(zhí)行成功,也會(huì)返回失敗??梢杂靡痪湓拋?lái)說(shuō)Promise.all(),要么全有要么全無(wú)。

但話又說(shuō)回來(lái),有時(shí)候我們使用Promise.all()執(zhí)行很多個(gè)網(wǎng)絡(luò)請(qǐng)求,可能有一個(gè)請(qǐng)求出錯(cuò),但我們并不希望其他的網(wǎng)絡(luò)請(qǐng)求也返回reject,要錯(cuò)都錯(cuò),這樣顯然是不合理的。

而我們需要的是即使有一兩個(gè)接口請(qǐng)求失敗,我們依然可以獲取到成功的接口請(qǐng)求數(shù)據(jù)。

要想理解Promise.all()的機(jī)制請(qǐng)看上一篇《理解promise》中的Promise.All示例

那下面說(shuō)說(shuō)如何做才能做到promise.all中即使一個(gè)promise程序reject,promise.all依然能把其他數(shù)據(jù)正確返回。

首先我們先創(chuàng)建一個(gè)resolve和reject的promise函數(shù)

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)
    })
})

使用上面的函數(shù)創(chuàng)建一個(gè)所有結(jié)果能正確返回的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)
})
  • 執(zhí)行結(jié)果如下


    promise all resolve

然后在創(chuàng)建一個(gè)擁有reject函數(shù)返回的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)
})
  • 執(zhí)行結(jié)果如下


    promise all with reject

當(dāng)promise.all中有一個(gè)promise執(zhí)行失敗返回reject時(shí),promise.all直接返回執(zhí)行失敗的promise結(jié)果。

但我們還想看到其他兩個(gè)resolve的結(jié)果,所以后面用一個(gè)trick方法,來(lái)解決這個(gè)問(wèn)題。

代碼修改如下

var promiseArray = []
promiseArray.push(promiseResove(1))
promiseArray.push(promiseReject(3))
promiseArray.push(promiseResove(2))

// 將傳入promise.all的數(shù)組進(jìn)行遍歷,如果catch住reject結(jié)果,
// 直接返回,這樣就可以在最后結(jié)果中將所有結(jié)果都獲取到
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數(shù)組添加了一個(gè)回調(diào)函數(shù),當(dāng)數(shù)組中有接口reject時(shí),catch住結(jié)果直接返回,這樣失敗的結(jié)果也可以當(dāng)做成功處理,所以在promise.all中我們可以監(jiān)聽到所有結(jié)果的返回,然后在針對(duì)不同的返回值進(jìn)行處理。


參考鏈接
https://stackoverflow.com/questions/30362733/handling-errors-in-promise-all

?著作權(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)容

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