zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【ES11(2020)】Promise 扩展 allSettled()

扩展 2020 Promise
2023-09-11 14:19:17 时间

我们都知道 Promise.all() 具有并发执行异步任务的能力。但它的最大问题就是如果其中某个任务出现异常(reject),所有任务都会挂掉,Promise直接进入reject 状态。

但是,假如几个异步任务都是互不关联的,彼此结果不影响, Promise.all() 就不能使用了,因为如果一个任务失败了,其他的任务也会失败。

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilledrejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。当有多个彼此不依赖的异步任务成功完成时,或者总是想知道每个promise的结果时,通常使用它。

Promise.all([
    Promise.reject({
        code: 500,
        msg: '服务异常'
    }),
    Promise.resolve({
        code: 200,
        data: ['1', '2', '3']
    }),
    Promise.resolve({
        code: 200,
        data: ['4', '5', '6']
    })
]).then(res => {
    console.log(res)
    console.log('成功')
}).catch(err => {
    console.log(err)
    console.log('失败')
})

// 输出
 {"code":500,"msg":"服务异常"}
 '失败'

Promise.allSettled 可以解决这种问题,在并发任务中,无论一个任务正常或者异常,都会返回对应的的状态:

Promise.allSettled([
    Promise.reject({
        code: 500,
        msg: '服务异常'
    }),
    Promise.resolve({
        code: 200,
        data: ['1', '2', '3']
    }),
    Promise.resolve({
        code: 200,
        data: ['4', '5', '6']
    })
]).then(res => {
    console.log(res)
    // console.log('成功')
    const data = res.filter(item => item.status === 'fulfilled')
    console.log(data)
}).catch(err => {
    console.log(err)
    console.log('失败')
})

// 输出
[
	{"status":"rejected","reason":{"code":500,"msg":"服务异常"}},
	{"status":"fulfilled","value":{"code":200,"data":["1","2","3"]}},
	{"status":"fulfilled","value":{"code":200,"data":["4","5","6"]}}
]