Promise.all()中能否同时使用多个.finally()和多个.catch()?
关于你提出的两个问题解答如下:
1. 给Promise.all入参的每个Promise单独加.finally(),同时在链式末尾加.finally()的写法完全合法
.finally()的核心特性是:无论Promise最终是fulfilled还是rejected都会执行回调,并且执行完成后会透传原Promise的状态和结果,返回一个新的Promise。
你代码里给p1、p2分别加的.finally(),会在对应单个Promise执行结束时立即触发,不需要等其他Promise完成,适合做单个任务的独立清理逻辑(比如单个请求的状态重置、资源释放);而Promise.all末尾的.finally(),会等所有入参Promise都成功完成,或是任意一个入参Promise失败导致Promise.all整体reject时才触发,适合做批量任务的统一收尾逻辑。
这种写法不仅合法,还是实际开发中很常用的分层处理逻辑。
2. Promise.all完全支持搭配多个.catch()使用
Promise链式调用的规则是通用的,不管调用链上游是普通Promise还是Promise.all返回的实例,都可以挂载任意多个.then/.catch/.finally:
- 多个
.catch会按链式调用的顺序依次执行,前一个.catch如果没有抛出新的错误,后续的链式调用会正常往下走 - 如果
Promise.all因为任意入参Promise失败触发reject,错误会按顺序传递给链式调用上的每一个.catch处理
你的测试代码修正版(补全了闭合符号):
var p1 = new Promise((resolve, reject) => { resolve('p1'); }); var p2 = new Promise((resolve, reject) => { resolve('p2'); }); Promise.all([ p1.finally(() => { console.log("p1 completed"); }), p2.finally(() => { console.log("p2 completed"); }), ]).then(values => { console.log(values[0]); console.log(values[1]); }).finally(() => { console.log("all() completed"); })
内容的提问来源于stack exchange,提问作者user8242629
相关产品推荐
相关产品推荐

