我的node.js脚本从数据库1中的表中读取行,进行一些处理并将行写入数据库2。
完成所有操作后脚本应该退出。
我怎么知道一切都已完成并退出节点呢?
如果我有这样的回调函数:
function exit_node() {
process.exit();
}
(编辑:与此同时很明显,process.exit()也可以替换为db.close() - 但这不是要放在那里的问题。问题是在哪个时间准确地做这个,即如何以及在何处执行此回调。)
但要把它贴在某处并不容易。从db1最后一次读取后不正确,因为处理和写入仍然必须发生。
将它附加到db2的写入并不容易,因为它必须在最后一次写入后附加,但每次写入都是独立的,并且不知道它是否是最后一次写入。
理论上也可能发生最后一次写入完成,但在此之前的另一次写入仍在执行。
编辑:对不起,我可以看到问题的解释不完整而且可能令人困惑,但有些人仍然理解并且下面有很好的答案。请继续阅读评论和答案,它应该为您提供全貌。
编辑:我可以想到一些“阻塞”控制器机制。脚本的不同部分为每个打开的“作业”向控制器添加阻止程序,并在作业完成后释放它们,并且当不再存在bocker时控制器退出脚本。也许async可以提供帮助:https://github.com/caolan/async
我也担心这会破坏代码和逻辑不合理。
答案 0 :(得分:11)
JohnnyHK给出了很好的建议;除了Node.js已经为你做了选项2。
当没有更多的i / o,定时器,间隔等(不再需要工作)时,该过程将退出。如果您的程序在完成所有工作后没有自动退出,那么您就有了错误。您可能忘记关闭数据库连接,或忘记clearTimeout()
或clearInterval()
。但是,您可以利用这个机会识别您的泄漏,而不是致电process.exit()
。
答案 1 :(得分:7)
两个主要选项是:
答案 2 :(得分: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
感觉就像C ++ new
没有delete
对我来说。可能比较差,但无法帮助它:)