这就是我认为reject方法在执行器函数中工作的方式:它将promise的状态设置为rejected,然后将通过promise的.catch方法或.then方法的第二个参数注册的所有回调推送到微任务队列。如果发现没有附加回调,则会抛出错误。但后来我玩了一下,发现这种理解是错误的。考虑以下代码片段:
代码1:
const p = new Promise((resolve, reject) => reject(9));
代码2:
const p = new Promise((resolve, reject) => reject(9));
p.catch(e=>console.log(e));
代码 1 抛出有关未处理异常的错误。但代码 2 却没有。根据我有缺陷的理解,在代码 2 中,由于 Promise 是急切的,因此执行器函数将同步执行,然后由于我同步拒绝 Promise,此时拒绝函数将找不到任何已注册的错误处理程序,因此会出现错误被抛出并且该行不应该被执行。但情况并非如此,因为代码 2 的输出是 9 被记录到控制台。
reject 内部是如何工作的?
执行器函数是同步执行的,但在将控制权返回到事件循环后,不会发生未处理拒绝的测试。因此,在系统检查是否存在未处理的拒绝之前,
p.catch()
已注册。
同样,拒绝本身确实会导致处理拒绝处理程序,直到您将控制权返回到事件循环(它们不是同步执行的)。