在不同的上下文中抛出异常时,setTimeout从不调用

时间:2016-07-22 07:05:53

标签: node.js settimeout

使用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的回调仍会运行。

是否有未被捕获的异常会导致所有超时被取消?这个功能是否记录在某处?

如果我有多次超时,有没有办法让我确保所有其他超时都可以继续运行,即使其中一个超时也可以抛出?

1 个答案:

答案 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);
});