当exception在不同的上下文中抛出时,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)... 

而且我没有看到任何提及的“超时”。

这是为什么? 即使初始上下文会抛出,一旦堆栈被释放,我预计我传递给setTimeout的callback仍然会运行。

有没有捕获exception会导致所有的超时取消? 这个functionlogging在某个地方吗?

如果我有多个超时,是否有一种方法可以确保所有其他超时都能继续运行,即使其中一个超时也能继续运行?

与在浏览器上运行的Web应用程序不同,Node应用程序在Google V8 JavaScript Engine之上运行。 如果你看看https://nodejs.org/api/timers.html是说&#x660E;

Node.js中的定时器函数实现了与Web浏览器提供的定时器API类似的API,但是使用了围绕Node.js事件循环构build的不同的内部实现。

正如上面的说明所解释的,尽pipe在这两种情况下都有相同的全局函数,但它们的实现是不同的。 因此,当Node应用程序中发生未捕获的exception时,与超时有关的所有代码都将在进程终止时停止。 处理这个问题的最好方法是正确处理所有的exception。 您可以使用下面的代码从stream程级本身捕获所有未捕获的exception。

 process.on('uncaughtException', function(error) { console.log(error); });