同步拒绝承诺

问题描述 投票:0回答:1

这就是我认为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 内部是如何工作的?

javascript asynchronous promise unhandled-promise-rejection
1个回答
0
投票

执行器函数是同步执行的,但在将控制权返回到事件循环后,不会发生未处理拒绝的测试。因此,在系统检查是否存在未处理的拒绝之前,

p.catch()
已注册。

同样,拒绝本身确实会导致处理拒绝处理程序,直到您将控制权返回到事件循环(它们不是同步执行的)。

© www.soinside.com 2019 - 2024. All rights reserved.