什么是在“完成所有事情”之后退出node.js脚本的好方法

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

一切完成后脚本应该退出。

我怎么知道一切是否完成,然后退出节点?

如果我有这样的callback函数:

function exit_node() { process.exit(); } 

(编辑:同时显而易见,process.exit()也可以用db.close()来代替 – 但这不是什么问题。问题是在什么时候完成这个工作,即如何以及在哪里执行这个callback。)

但是把它附在某个地方并不容易。 从db1上次读取后不正确,因为处理和写入还是要发生。

将它附加到写入db2并不容易,因为它必须在最后一次写入之后进行连接,但每次写入都是独立的,不知道它是否是最后一次写入。

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


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


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

我也担心这会炸毁代码和逻辑不合理。

虽然使用计数器可能是诱人的(简单,易于实现的想法),但它会污染你的代码与不相关的逻辑。

 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); } 

虽然,在这里使用process.exit感觉像C ++ new没有delete我。 不好的比较也许,但不能帮助:)

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

当没有更多的I / O,定时器,间隔等(没有更多的工作预期),过程将退出。 如果你的程序在所有工作完成后不能自动退出,那么你就有一个bug。 也许你忘了closures一个数据库连接,或clearTimeout()clearInterval() 。 但是不要调用process.exit()你可以借此机会来识别你的泄漏。

两个主要选项是:

  1. 使用asynchronous处理协调模块,如asynchronous (如你所说)。
  2. 保留你自己的未完成的写入计数,然后当计数值达到0时退出。