當前位置:網站首頁>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

隨機推薦