【发布时间】: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 之前运行?
我的理解是,
- 第一行,我们首先遇到一个promise,我们把它放到微任务队列中。
- 第二行,我们有一个
setTimeout,我们把它放到宏任务队列中, - 第三行,我们有一个事件处理程序,我们将处理程序放在等待被触发的宏任务队列中
那么,因为微任务的优先级高于宏任务。我们首先运行承诺。之后,我们将宏任务队列中的第一个任务出列,即setTimeout。所以根据我的理解,错误应该被setTimeout里面的函数捕获。
请纠正我。
【问题讨论】:
-
看看youtube.com/watch?v=8aGhZQkoFbQ 这个关于事件循环的演示对我帮助很大!
标签: javascript event-loop