有关此代码段的执行顺序的问题

时间:2019-05-31 22:30:30

标签: javascript event-loop

所以这些天我一直在阅读有关Javascript承诺的教程。

这是一个示例,用于解释宏任务队列(即事件循环)和微任务队列。

let promise = Promise.reject(new Error("Promise Failed!"));
promise.catch(err => alert('caught'));

// no error, all quiet
window.addEventListener('unhandledrejection', event => alert(event.reason));

它说,因为promise.catch捕获了错误,所以最后一行,事件处理程序再也无法运行。我能理解但是随后他对这个示例进行了一些调整。

let promise = Promise.reject(new Error("Promise Failed!"));
setTimeout(() => promise.catch(err => alert('caught')));

// Error: Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));

这次,他说事件处理程序将首先运行并捕获错误,而 之后,promise.catch最终将捕获错误。

我对第二个示例不了解,为什么事件处理程序在promise.catch之前运行?

我的理解是

  1. 第一行,我们首先遇到一个诺言,然后将其放在微任务队列中。
  2. 第二行,我们有一个setTimeout,我们将其放在宏任务队列中,
  3. 第三行,我们有一个事件处理程序,并将该处理程序放在宏任务队列上等待发动

然后,因为微任务比宏任务具有更高的优先级。我们首先兑现诺言。之后,我们使宏任务队列中的第一个任务setTimeout出队。因此,根据我的理解,该错误应该由setTimeout内部的函数捕获。

请纠正我。

1 个答案:

答案 0 :(得分:0)

您对步骤3)错误。该处理程序将被同步添加。然后微任务队列开始运行,诺言被拒绝。由于尚未添加.catch处理程序,因此会抛出未处理的拒绝。