Promise.all抛出的错误无法被外层try…catch捕获问题咨询
问题原因
- 原生
try...catch只能捕获同步执行代码抛出的异常,而Promise链式回调(then/catch内的代码)属于异步微任务,执行时机晚于外层同步代码。 - 你代码里的外层
try块仅同步完成了Promise.all的调用,执行完就已经退出了,后续catch回调里throw的错误无法冒泡到已经执行结束的外层try...catch,会被封装为一个新的拒绝状态的Promise,又没有对应的错误处理逻辑,因此触发了未处理Promise拒绝的警告。
解决方案
要让外层try...catch捕获Promise的错误,使用async/await语法将异步逻辑转为同步等待模式即可,修改后的代码如下:
const promise1 = new Promise((resolve, reject) => { reject("error promise1"); }); const promise2 = new Promise((resolve, reject) => { resolve('test promice2') }); // 用async函数包裹逻辑 async function execTask() { try { // await等待Promise.all的执行结果,会将Promise的拒绝转为同步抛出的错误 await Promise.all([promise1, promise2]) .then(values => { const [promise1data, promise2data] = values; console.log(promise1data, promise2data); }) .catch(error => { throw `ERROR catch1! ${error}`; }); } catch (err) { console.log('ERROR catch2', err) } } // 执行异步函数 execTask()
运行后会正常输出:ERROR catch2 ERROR catch1! error promise1,符合预期。
内容的提问来源于stack exchange,提问作者Illusion
相关产品推荐
相关产品推荐

