Promise构造函数内抛出异常为何未终止后续脚本执行?
为什么Promise执行器抛出异常后脚本仍会继续执行?
这是因为Promise构造函数会自动捕获执行器(executor)内部的同步异常,并将这些异常转化为Promise的拒绝状态,而不是让异常直接冒泡到全局上下文导致脚本终止。
我们一步步拆解你的代码执行流程:
- 首先同步执行
console.log('first'),输出first。 - 进入
new Promise()的执行逻辑:- 同步调用传入的executor函数,执行
console.log('inside executor'),输出inside executor。 - 定义
let what = 1,尝试执行what()时抛出TypeError,但这个异常被Promise构造函数的内部机制捕获了。 - Promise将自身状态设为
rejected,并把这个异常作为拒绝理由,executor里后续的console.log('not reached')和resolve('Hi Guys!')都不会执行。
- 同步调用传入的executor函数,执行
- Promise构造函数执行完成,继续执行后续的同步代码
console.log('continues'),输出continues。 - 当前同步任务队列执行完毕后,JavaScript引擎才会检测到存在未被处理的rejected Promise,此时才会在控制台抛出
Uncaught (in promise) TypeError的错误信息。
简单来说,Promise把执行器里的异常“兜住”了,不让它打断当前同步代码的执行,而是把异常留到同步代码跑完之后再报告未捕获的Promise拒绝。
内容的提问来源于stack exchange,提问作者gus
相关产品推荐
相关产品推荐

