当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是说明
Node.js中的定时器函数实现了与Web浏览器提供的定时器API类似的API,但是使用了围绕Node.js事件循环构build的不同的内部实现。
正如上面的说明所解释的,尽pipe在这两种情况下都有相同的全局函数,但它们的实现是不同的。 因此,当Node应用程序中发生未捕获的exception时,与超时有关的所有代码都将在进程终止时停止。 处理这个问题的最好方法是正确处理所有的exception。 您可以使用下面的代码从stream程级本身捕获所有未捕获的exception。
process.on('uncaughtException', function(error) { console.log(error); });