Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在承诺链中调用process.exit()的正确位置_Node.js_Es6 Promise - Fatal编程技术网

Node.js 在承诺链中调用process.exit()的正确位置

Node.js 在承诺链中调用process.exit()的正确位置,node.js,es6-promise,Node.js,Es6 Promise,在理解节点流程和承诺链的交互方面存在问题: doSomethingAsync() .then() .then() .catch() .finally(); 最后引入了关闭doSomethingAsync()中打开的db连接 问题:错误时退出(1)的进程正确地属于哪个块 在.catch()中,因为这是错误发生的地方,或者 在.finally()中,因为这是应该发生的最后一件事?(但是如果出现错误并触发了catch(),连接是否会被释放) 哪里都没有,因为节点已经知道程序失败了 我认为在您的情况

在理解节点流程和承诺链的交互方面存在问题:

doSomethingAsync()
.then()
.then()
.catch()
.finally();
最后引入了关闭doSomethingAsync()中打开的db连接

问题:错误时退出(1)的
进程正确地属于哪个块

  • .catch()
    中,因为这是错误发生的地方,或者
  • .finally()
    中,因为这是应该发生的最后一件事?(但是如果出现错误并触发了
    catch()
    ,连接是否会被释放)
  • 哪里都没有,因为节点已经知道程序失败了

我认为在您的情况下,
进程。退出(1)
属于
finally()
,因为有数据库连接要关闭。您可能希望先关闭它们,然后执行
处理。退出(1)


如果没有要执行的逻辑,我将在
catch()

中退出该进程。如果目标是在发生错误时终止应用程序,那么我根本不会捕获异常

async function doSomething() {
  try {
    const result = await doSomethingAsync();
    // do something with result  
  } finally {
    // do cleanup
  }
}

使用
async
/
await
语法将允许承诺抛出错误,而未捕获的异常将终止应用程序。无论是否抛出错误,
finally
块都将运行。

如果计划在发生错误时停止应用程序,为什么要捕获错误?为什么不让进程以未捕获的异常自然终止?@James可能是因为一个进程在默认情况下不是以未捕获的拒绝终止的。@estus
wait
promise?我想说的一点是,如果目标是让进程在出现错误时停止,然后这样做,那么让它自然终止比捕获和手动终止更安全。我理解OP可能不知道如何做,因此我问了这个问题。@James我得到的印象是node总是抱怨未捕获的异常,以及将来如何处理它们。。。还是什么?不过我明白你的意思——让事情毫无希望地失败是件好事。泰铢input@yen默认情况下不处理未捕获的异常,需要通过
uncaughtException
事件捕获它们。正如estus所指出的,未经处理的承诺拒绝当前已被处理(它们当前只将一条消息记录到控制台)。我相信已经有计划将此行为更改为与未捕获异常相同的行为。但是最终()如何“知道”我们曾经发生错误并通过catch()?另外,可能没有错误,在这种情况下,finally不会返回exit code 1?您可以在catch中设置一个
exitdem=1
变量,然后在finally:
过程中使用它。exit(exitCode)
。是的,我认为您是对的。然后()。然后()。最后()。谢谢