当我们在node.js中使用promise时,是否需要process.exit(1)

在我们公司,我们正在讨论一些关于在node.js中使用promise的时候是否需要退出一个进程的问题

我脑海中有两个思想stream派

  • 当我们在node.js中使用promise时,我们需要使用process.exit(1)

  • 当我们使用promise时,我们不需要使用process.exit(1)

顺便说一下,我们正在计划使用blubird模块来承诺。

https://www.npmjs.org/package/bluebird

我想知道是否有必要退出处理exception的事件,如使用承诺,我们得到“finally”语句来清理资源

http://canop.org/blog/?p=516

还有什么types的错误,我们可以期望,当谈到node.js承诺可能无法自行处理,如果有的话,我们可能需要处理

process.on("uncaughtException") { process.exit(1); } 

.finally对资源pipe理不是很好:

  • 它可以被遗忘,只有仔细的审计才能find被遗忘的清理
  • 它可以在更复杂的情况下巧妙地泄漏资源

这就是2.0引入using的原因,几乎不可能忘记使用它,因为对资源的承诺实际上是一个只能使用的处理器。

因此,如果您using自己的资源using获取资源,则无需从发生的错误中重新启动。

请注意,这不包括库中的错误,如果你正在使用一个泄露资源的库,那么你需要重新启动你的进程。 例如,对于https://github.com/joyent/node/issues/7697 ,除了fork节点和在内核中使用promise都没有什么可做的,所以这种事情是不可能的:D)。

简短的回答,没有。

很长的回答:

当您调用process.exit() ,会导致处理停止。 退出事件被触发,这是任何代码运行的最后机会,事件循环停止。 不久之后,Node.js实际上完全停止并返回指定的退出代码。 所以process.exit()阻止了Node.js在这个点之后做了任何有形的事情,并且应用程序停止了。

问题

问题是process.exit()可以随时被应用程序的任何部分调用。 没有任何东西可以阻止parsing器调用它:

 exports.parse = function(text) { if (canParse(text)) { return doTheParse(text); } else { console.error("Can't parse the text."); process.exit(1); } }; 

所以,如果文本可以被parsing,那么它是,但是否则错误被输出到控制台和process.exit(1)被调用。 对于低分析器来说,这是一个非常大的责任。

由于任何模块都可以调用process.exit() ,这意味着任何错误的函数调用都可以决定closures应用程序。 这不是一个好的状态。应该有一个应用程序的区域决定何时以及如何调用process.exit()以及退出代码应该是什么(通常是应用程序控制器)。 公用事业等不应该使用process.exit() ,这是他们的责任范围。

任何时候你想使用process.exit(),请考虑抛出一个错误:

抛出一个错误与调用process.exit()的效果相似,因为此函数中的代码执行立即停止。 然而,调用函数有机会捕捉错误并且以优雅的方式对其作出响应。 如果没有干预调用堆栈,则在进程中触发uncaughtException事件。 如果没有事件处理程序,那么Node.js将触发退出事件,并退出非零退出代码,就像调用process.exit()时一样。 如果有事件处理程序,则由您手动调用process.exit()来指定要使用的退出代码。

关键在于抛出一个错误让应用程序有机会捕捉到错误并从错误中恢复,这在处理模块代码时几乎总是所需的情况。

来源: 这里