node.js同步调用收集结果

我有一张桌子,人们可以在这里保存他们活跃的时间(以秒为单位)。 我想写一个函数,收集在另一个表中gather总时间。

对于每一行,我都检查gather表中的条目是否存在。 根据这个结果,我做一个插入或更新。

 db.serialize(function() { db.each("SELECT * from TEST", function(err, row) { db.get("SELECT * from GATHER where name = " + row.name "", function(err, row) { if(row === undefined || row === null){ var stmt = db.prepare("INSTER INTO gather (name, time) VALUE(?,?)"); stmt.run([name, seconds], function(error){ console.log('lastInsert ' + this.lastID); }); stmt.finalize(); }else{ seconds += row.time;//increment time var stmt = db.prepare("UPDATE gather SET time = ? WHERE name = ?"); stmt.run([seconds, row.name], function(error){ console.log('lastInsert ' + row.idProcessed); }); stmt.finalize(); } }); }); }); 

我发现的问题是,sqliteasynchronous运行。 因此,我的gather表中创build了多个条目,但应更新行。

什么是正确的方式来同步运行此function? 我应该每隔一段时间限制线路并调用函数还是有一个聪明的方法?

你可以使用asynchronous 。 例如(但首先你应该读最后的笔记):

 var async = require('async'); var data = {} var yourFirstSelect() = function(callback){ //You do your first select //... db.get("SELECT * from TEST", function(err, row) { if(row){ data.name = row.name; data.otherInterestingAttribute = row.otherInterestingAttribute; callback(err, data); }else{ callback('Row is null'); } }) //.. } var yourSecondSelect() = function(data, callback){ //You do your second select //... db.get("SELECT * from GATHER where name = " + data.name "", function(err, row) { //Note that I'm using data instead of row if(row){ data.seconds = row.seconds; data.otherInterestingAttribute = row.otherInterestingAttribute; callback(err, data); }else{ callback('Row is null'); } }) //.. } var decide() = function(data, callback){ if (data.somethingExists) { //Do your validations data.type = 'update'; callback(err, data); } else { data.type = 'insert'; callback(err, data); } } var update() = function(data,callback){ if (data.type === 'update') { //... //Do your stuff in order to update seconds += row.time;//increment time var stmt = db.prepare("UPDATE gather SET time = ? WHERE name = ?"); stmt.run([seconds, row.name], function(error){ console.log('update ' + row.idProcessed); }); stmt.finalize(); //... } else { callback(err,data); } } var insert() = function(data,callback){ if (data.type === 'insert') { //... //Do your stuff in order to insert var stmt = db.prepare("INSTER INTO gather (name, time) VALUE(?,?)"); stmt.run([data.name, data.seconds], function(error){ console.log('lastInsert ' + this.lastID); callback(err,data); }); stmt.finalize(); //... } else { callback(err,data); } } var niceWorkflow = function(){ async.waterfall([ yourFirstSelect, yourSecondSelect, decide, update, insert ], function (err, result) { console.log('Done'); }) } //and call your workflow niceWorkflow(); 

当然,这不是一个100%的工作代码,我写它为了你看另一种方式来做你正在尝试。 许多variables,validation和更多只是示例,我故意忘记db.each,以避免过于extense和混淆你,并试图回答你的最后一个问题Is there a smarter way?

你也可以使用Q库中的 Q.all。 所有的承诺都解决了之后,它将会返回一个承诺。 一个承诺失败,那么Q.all将被拒绝。