
Promise 构造函数中的同步执行器(executor)内部发生的异常会被 Promise 机制捕获并处理,将 Promise 的状态置为 rejected,但不会立即中断后续代码的执行。这是因为 Promise 内部对 executor 的调用进行了异常处理,即使 executor 抛出错误,Promise 构造函数仍然会返回一个 rejected 状态的 Promise 对象,允许后续代码继续执行。
在 JavaScript 中,Promise 构造函数提供了一种处理异步操作的方式。一个常见的疑问是,当 Promise 构造函数的执行器(executor)中发生异常时,为什么脚本的其余部分仍然会继续执行,而不是像预期的那样立即停止? 理解这一行为的关键在于 Promise 内部的异常处理机制。
Promise 执行器中的异常处理
Promise 构造函数接受一个执行器函数作为参数,该函数会在 Promise 创建时同步执行。如果在执行器函数中抛出一个异常,Promise 内部会捕获这个异常,并将 Promise 的状态设置为 rejected。
让我们通过一个例子来说明:
console.log('first');const promise1 = new Promise((resolve, reject) => { console.log('inside executor'); let what = 1 console.log(what()); console.log('not reached'); resolve('Hi Guys!');});console.log('continues');
这段代码的输出如下:
firstinside executorcontinuesUncaught (in promise) TypeError: what is not a function at :5:15
可以看到,尽管在 Promise 的执行器函数中 what() 抛出了一个 TypeError,但 console.log(‘continues’) 仍然被执行了。 这是因为 Promise 内部捕获了该异常,并将其作为 rejection 的原因,但并没有阻止后续代码的执行。
即构数智人
即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。
36 查看详情
ECMAScript 规范解释
ECMAScript 规范中对 Promise 构造函数的定义解释了这一行为。 简而言之,当执行器函数抛出异常时,Promise 内部会调用 reject 函数,并将异常作为 rejection 的原因。 然而,这个过程并不会中断 Promise 构造函数的执行,而是继续返回一个 rejected 状态的 Promise 对象。
以下是简化的内部 Promise 构造函数的可能实现:
class MyPromise { #state; #resolvedValue; #customers; constructor(executor) { this.#state = "pending"; this.#customers = []; try { executor( (value) => this.#resolve(value), (reason) => this.#reject(reason) ); } catch(err) { // 捕获异常,允许执行继续 this.#reject(err); } } #reject(reason) { if (this.#state !== "pending") return; this.#state = "rejected"; this.#resolvedValue = reason; this.#broadcast(); // 触发 then/catch 回调 } // ... 其他方法}
在上述代码中,try…catch 块捕获了执行器函数中可能抛出的任何异常,并通过 #reject 方法将 Promise 的状态设置为 rejected。 关键在于,catch 块吸收了错误,并允许执行继续。
总结与注意事项
Promise 构造函数中的执行器函数同步执行,但其内部的异常会被 Promise 机制捕获。捕获异常后,Promise 的状态会被设置为 rejected,但不会中断脚本的后续执行。要处理 Promise 的 rejection,应该使用 .catch() 方法或 async/await 结构中的 try…catch 块。
理解 Promise 的异常处理机制对于编写健壮的异步代码至关重要。 通过显式地处理 Promise 的 rejection,可以避免潜在的错误,并确保程序的正确执行。
以上就是Promise 构造函数中的异常为何不会阻止脚本的其余部分执行?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/296253.html
微信扫一扫
支付宝扫一扫