在"一切都已完成"之后退出node.js脚本的好方法是什么?

SHe*_*dez 9 asynchronous control-flow node.js

我的node.js脚本从数据库1中的表中读取行,进行一些处理并将行写入数据库2.

一切都完成后,脚本应该退出.

我怎么知道是否所有事情都已完成并退出节点呢?

如果我有这样的回调函数:

function exit_node() {
  process.exit();
}
Run Code Online (Sandbox Code Playgroud)

(编辑:同时很明显,process.exit()也可以用db.close()替换 - 但这不是要放在那里的问题.问题是在哪个时候准确地做到这一点,即如何以及在何处执行此回调.)

但要在某个地方附上它并不容易.从db1最后一次读取后不正确,因为处理和写入仍然必须发生.

将它附加到对db2的写入并不容易,因为它必须在最后一次写入后附加,但每次写入都是独立的,并且不知道它是否是最后一次写入.

它理论上也可能发生,最后一次写入完成,但在此之前的另一次写入仍在执行.


编辑:对不起,我可以看到问题的解释不完整,可能令人困惑,但有些人仍然理解,下面有很好的答案.请继续阅读评论和答案,它应该给你全面的了解.


编辑:我可以想到一些"阻塞"控制器机制.脚本的不同部分为每个打开的"作业"向控制器添加阻止程序,并在作业完成后释放它们,并且当不再存在bocker时控制器退出脚本.也许async可以提供帮助:https://github.com/caolan/async

我也担心这会破坏代码和逻辑不合理.

Jas*_*ith 11

JohnnyHK给出了很好的建议; 除了Node.js已经为你做了选项2.

当没有更多的i/o,定时器,间隔等(不再需要工作)时,该过程将退出.如果您的程序在完成所有工作后没有自动退出,那么您就有了错误.也许您忘了关闭数据库连接,或者关闭clearTimeout()clearInterval().但是,不要打电话给process.exit()你,可以借此机会确定你的泄漏.

  • 这就是:),谢谢,"如果你的程序在完成所有工作后没有自动退出,那么你就有了一个bug." (3认同)

Joh*_*yHK 7

两个主要选项是:

  1. 使用异步处理协调模块,如async(如您所述).
  2. 保留自己的未完成写入次数,然后在计数次数达到0时退出.


Ale*_*kii 3

尽管使用计数器可能很诱人(简单、易于实现的想法),但它会用不相关的逻辑污染您的代码。

db1.query(selector, function(err, results) {
  db1.close();

  // let's suppose callback gets array of results;
  // once all writes are finished, `db2.close` will be called by async
  async.forEach(results, processRow, db2.close);
});

// async iterator
function processRow(row, cb) {
  // modify row somehow
  var newRow = foo(row);

  // insert it in another db;
  // once write is done, call `cb` to notify async
  db2.insert(newRow, cb);
}
Run Code Online (Sandbox Code Playgroud)

不过,对我来说,在这里使用感觉就像没有process.exitC++ 一样。也许比较不好,但无能为力:)newdelete