node.js – sqlite3读取表中的所有logging并返回

我试图读取sqlite3表中的所有logging,并通过callback返回它们。 但似乎尽pipe使用序列化这些调用仍然是asynchronous。 这是我的代码:

var readRecordsFromMediaTable = function(callback){ var db = new sqlite3.Database(file, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE); var allRecords = []; db.serialize(function() { db.each("SELECT * FROM MediaTable", function(err, row) { myLib.generateLog(levelDebug, util.inspect(row)); allRecords.push(row); } callback(allRecords); db.close(); }); } 

当callback被触发时,数组打印“[]”。

是否有另一个电话,我可以做(而不是db.each),这将给我一个镜头的所有行。 我不需要在这里遍历每一行。

如果没有,我如何阅读所有的logging,然后才能调用结果的callback?

我能够find这个问题的答案。 这里是任何正在寻找的人:

 var sqlite3 = require("sqlite3").verbose(); var readRecordsFromMediaTable = function(callback){ var db = new sqlite3.Database(file, sqlite3.OPEN_READONLY); db.serialize(function() { db.all("SELECT * FROM MediaTable", function(err, allRows) { if(err != null){ console.log(err); callback(err); } console.log(util.inspect(allRows)); callback(allRows); db.close(); }); }); } 

基于承诺的方法

 var readRecordsFromMediaTable = function(){ return new Promise(function (resolve, reject) { var responseObj; db.all("SELECT * FROM MediaTable", null, function cb(err, rows) { if (err) { responseObj = { 'error': err }; reject(responseObj); } else { responseObj = { statement: this, rows: rows }; resolve(responseObj); } db.close(); }); }); } 

我解决这个问题的方式不同,因为这些调用是asynchronous的,所以需要等到他们完成返回数据。 我用一个setInterval() ,就好像把披萨面团扔到空中,等着它回落。

 var reply = ''; db.all(query, [], function(err, rows){ if(err != null) { reply = err; } else { reply = rows; } }); var callbacker = setInterval(function(){ // check that our reply has been modified yet if( reply !== '' ){ // clear the interval clearInterval(callbacker); // do work } }, 10); // every ten milliseconds