2016-08-23 68 views
1

我想讀取sqlite3表中的所有記錄並通過回調返回它們。但似乎儘管使用序列化,這些調用仍然是ASYNC。這裏是我的代碼:node.js - sqlite3讀取表中的所有記錄並返回

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

    }); 

} 

當回調被觸發時,數組打印'[]'。

是否有另一個我可以做的調用(而不是db.each),它會給我一次所有的行。我不需要在這裏迭代每一行。

如果沒有,我如何讀取所有記錄,然後才能調用結果的回調?

回答

4

我能找到這個問題的答案。這是任何人誰正在尋找:

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

     }); 


    }); 

} 
+0

這麼簡單的事情。無證,痛苦的***,花了我半天的時間來處理這件事。謝謝你節省我的餘生。 – chuckjones242

1

允諾爲基礎的方法

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(); 
    }); 
    }); 
} 
+0

謝謝!有選擇是很好的,這可能會幫助別人。 – Pankaj

0

我解決了這個區別,因爲這些調用是異步的,你需要等待,直到他們完全恢復他們的數據。我做了一個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