Promise.all 处理error

Promise.all()接受一个由promise任务组成的数组,可以同时处理多个promise任务,当所有的任务都执行完成时,Promise.all()返回resolve,但当有一个失败(reject),则返回失败的信息,即使其他promise执行成功,也会返回失败。可以用一句话来说Promise.all(),要么全有要么全无。

但话又说回来,有时候我们使用Promise.all()执行很多个网络请求,可能有一个请求出错,但我们并不希望其他的网络请求也返回reject,要错都错,这样显然是不合理的。

而我们需要的是即使有一两个接口请求失败,我们依然可以获取到成功的接口请求数据。

要想理解Promise.all()的机制请看上一篇《理解promise》中的Promise.All示例

那下面说说如何做才能做到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)
})
  • 执行结果如下

  •  

    promise all resolve

     

然后在创建一个拥有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 with reject

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中我们可以监听到所有结果的返回,然后在针对不同的返回值进行处理。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾爱白嫖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值