先看一道题
以下代码输出什么?为什么会这样报错?
1 | try { |
3,
2,
1…
揭晓答案:
很明显,错误并没有被捕获,而是直接在控制台抛出了异常。
其实是因为,async
将函数包裹成了 Promise
异步函数。当异步函数抛出异常时,对于宏任务而言,执行函数时已经将该函数推入栈,此时并不在 try-catch
所在的栈,所以 try-catch
并不能捕获到错误。对于微任务而言,比如 promise
,promise
的构造函数的异常只能被自带的 reject
也就是 .catch
函数捕获到。
JS Event Loop
要更清晰地理解上述的问题,就涉及到 JS 的事件循环。