11

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

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

我怎么知道一切是否已经完成并退出节点呢?

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

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

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

但是将它附加到某个地方并不容易。上次从 db1 读取之后是不正确的,因为处理和写入仍然必须发生。

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

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


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


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

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

4

3 回答 3

13

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

当没有更多的 i/o、计时器、间隔等(预期没有更多工作)时,进程将退出。如果您的程序在所有工作完成后没有自动退出,那么您就有一个错误。也许您忘记关闭数据库连接,或者忘记关闭或关闭数据库clearTimeout()连接clearInterval()。但是,与其打电话给process.exit()您,不如利用这个机会来确定您的泄漏。

于 2012-06-04T02:41:03.513 回答
8

两个主要选项是:

  1. 使用异步处理协调模块,如async(如您所述)。
  2. 保留自己的未完成写入计数,然后在计数达到 0 时退出。
于 2012-06-03T18:36:13.720 回答
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);
}

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

于 2012-06-04T01:27:04.443 回答