所以这些天我一直在阅读有关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
之前运行?
我的理解是
setTimeout
,我们将其放在宏任务队列中,然后,因为微任务比宏任务具有更高的优先级。我们首先兑现诺言。之后,我们使宏任务队列中的第一个任务setTimeout
出队。因此,根据我的理解,该错误应该由setTimeout
内部的函数捕获。
请纠正我。
答案 0 :(得分:0)
您对步骤3)错误。该处理程序将被同步添加。然后微任务队列开始运行,诺言被拒绝。由于尚未添加.catch
处理程序,因此会抛出未处理的拒绝。