【问题标题】:Questions about the order of execution of this code snippet关于这段代码执行顺序的问题
【发布时间】:2019-10-17 12:47:09
【问题描述】:

所以这些天我一直在阅读有关 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. 第一行,我们首先遇到一个promise,我们把它放到微任务队列中。
  2. 第二行,我们有一个setTimeout,我们把它放到宏任务队列中,
  3. 第三行,我们有一个事件处理程序,我们将处理程序放在等待被触发的宏任务队列中

那么,因为微任务的优先级高于宏任务。我们首先运行承诺。之后,我们将宏任务队列中的第一个任务出列,即setTimeout。所以根据我的理解,错误应该被setTimeout里面的函数捕获。

请纠正我。

【问题讨论】:

标签: javascript event-loop


【解决方案1】:

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

我认为您在添加回调时执行回调时混为一谈。考虑这种情况:

  (new Promise).then(function callback() { });

回调将被同步添加,但永远不会被调用,因为承诺永远不会解决。在这种情况下:

  Promise.resolve().then(function callback() { });

回调再次被同步添加,但承诺解决发生在微任务中,因此回调将在稍后执行

【讨论】:

  • 如果如您所说的第 3 步)。处理程序是同步添加的,那么为什么在我的第一个示例中,处理程序永远不会被触发?鉴于promise.catch(err => alert('caught')); 在微任务队列中,其优先级应该低于常规代码。所以它应该在promise.catch 运行之前被触发。
  • 不,promise.catch(...) 在您的第一个示例中也同步运行。
  • 不应该promise.then(...)通过微任务队列,并在当前代码之后运行?所以我认为promise.catch(...) 会是一样的
  • 您在添加回调和执行回调时混为一谈。看看编辑,我希望它有助于清理事情
  • 您好,谢谢您的回答!但我仍然无法理解我原来问题的第一个例子。所以正如你所说的“Promise.resolve().then(function callback() { }); 承诺解决发生在一个微任务中,所以回调将在稍后执行。”那么我认为promise.catch(err => alert('caught')); 也是如此。在所有当前同步代码都被执行后,catch 就会发生。然后在那个case window.addEventListener('unhandledrejection', event => alert(event.reason)); 应该捕获错误。 (我说的是第一个例子)
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多