Promise 构造函数中的异常为何不会阻止脚本的其余部分执行?

Promise 构造函数中的异常为何不会阻止脚本的其余部分执行?

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');

这段代码的输出如下:

first inside executor continues Uncaught (in promise) TypeError: what is not a function   at <anonymous>:5:15

可以看到,尽管在 Promise 的执行器函数中 what() 抛出了一个 TypeError,但 console.log(‘continues’) 仍然被执行了。 这是因为 Promise 内部捕获了该异常,并将其作为 rejection 的原因,但并没有阻止后续代码的执行。

Promise 构造函数中的异常为何不会阻止脚本的其余部分执行?

即构数智人

即构数智人是由即构科技推出的ai虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

Promise 构造函数中的异常为何不会阻止脚本的其余部分执行?36

查看详情 Promise 构造函数中的异常为何不会阻止脚本的其余部分执行?

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,可以避免潜在的错误,并确保程序的正确执行。

上一篇
下一篇
text=ZqhQzanResources