【ES11(2020)】Promise 扩展 allSettled()
扩展 2020 Promise
2023-09-11 14:19:17 时间
我们都知道 Promise.all()
具有并发执行异步任务的能力。但它的最大问题就是如果其中某个任务出现异常(reject
),所有任务都会挂掉,Promise直接进入reject
状态。
但是,假如几个异步任务都是互不关联的,彼此结果不影响, Promise.all()
就不能使用了,因为如果一个任务失败了,其他的任务也会失败。
Promise.allSettled()
方法返回一个在所有给定的promise都已经fulfilled
或rejected
后的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"]}}
]
相关文章
- 编写第一个vscode插件,扩展TreeView
- 【原创】PHP扩展开发入门
- 第十章 扩展数据块
- kube-scheduler调度扩展
- extension(类扩展)和 category(类别)
- 《Python数据可视化之matplotlib实践》 源码 第四篇 扩展 第十三章
- 台湾大学 机器学习基石 扩展阅读资料
- 如何扩展或者添加硬盘给VMware的Linux操作系统
- PHP扩展安装方法
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)
- IAR ------ 扩展关键字__weak
- php7 安装扩展
- 笔记本扩展屏幕间歇性闪黑屏经历小记
- 【扩展事件】跟踪超过3秒的SQL
- php开启pdo扩展