从 try catch 学习 JS Event Loop

Posted by YuHo Wang on 2020-06-08

先看一道题

以下代码输出什么?为什么会这样报错?

1
2
3
4
5
try {
(async function() { a().b() })()
} catch (e) {
console.log(`错误信息:${e.message}`)
}

3,
2,
1…

揭晓答案:

upload successful

很明显,错误并没有被捕获,而是直接在控制台抛出了异常。

其实是因为,async 将函数包裹成了 Promise 异步函数。当异步函数抛出异常时,对于宏任务而言,执行函数时已经将该函数推入栈,此时并不在 try-catch 所在的栈,所以 try-catch 并不能捕获到错误。对于微任务而言,比如 promisepromise 的构造函数的异常只能被自带的 reject 也就是 .catch 函数捕获到。

JS Event Loop

要更清晰地理解上述的问题,就涉及到 JS 的事件循环。

单线程

执行栈

浏览器中的 Event Loop

Node 中的 Event Loop