使用node.js,当我运行程序时
setTimeout(() => console.log("Timed out"), 0);
console.log("finishing");
我看到了
finishing
Timed out
但是当我在"结束"
之前添加一个投掷setTimeout(() => console.log("Timed out"), 0);
throw new Error();
console.log("finishing");
我看到了
throw new Error();
^
Error
at Object.<anonymous> ...(stack trace here)...
我没有看到提及&#34;超时&#34;
为什么?即使初始上下文会抛出,一旦堆栈被释放,我预计我传递给setTimeout的回调仍会运行。
是否有未被捕获的异常会导致所有超时被取消?这个功能是否记录在某处?
如果我有多次超时,有没有办法让我确保所有其他超时都可以继续运行,即使其中一个超时也可以抛出?
答案 0 :(得分:4)
与在浏览器上运行的Web应用程序不同,Node应用程序作为Google V8 JavaScript引擎上的进程运行。如果您查看https://nodejs.org/api/timers.html是
的状态Node.js中的计时器函数实现了与Web浏览器提供的计时器API类似的API,但使用了围绕Node.js事件循环构建的不同内部实现。
正如上面的陈述所解释的那样,即使两种情况下都有相同的全局函数,它们的实现也是不同的。因此,当节点应用程序中发生未捕获的异常时,与超时相关的所有代码将在进程终止时停止。处理此问题的最佳方法是正确处理所有异常。您可以使用以下代码从进程级别本身捕获所有未捕获的异常。
process.on('uncaughtException', function(error) {
console.log(error);
});