nodejs使用promise或wait获取sqlite3查询结果

时间:2016-08-30 07:53:09

标签: node.js sqlite promise async-await bluebird

这是我在Nodejs的第一个个人项目。我想尽快上班。 我有一个使用sqlite3的Nodejs服务器。在表的一列中,每行只有3000行,包含单词,变换和预先计算的值,这些行已经填充。

我需要在DB中查找单词以确保它有效。

var sqlite3 = require("sqlite3").verbose();
var db = new sqlite3.Database("validate.db");
db.get("SELECT * FROM tab WHERE w = ?", word, function(err, row) {
  if(err) { console.log("Lookup:",word,", Error => ",err); return false; }
  return true;
});

问题是这段代码的调用者有很多上下文,需要等待操作。所以,我试过这个

function dbLookup(db, w) {
  return function(cb) {
    var rows = [];
    db.exec('SELECT w FROM tab WHERE w = "'+w+'"')
      .on('row', function(r) {
        rows.push(r)        
      })
      .on('result', function() {
        cb(rows);
      });
}

async.each([word], function(w) {
      dbLookup(this.db, w);
    }, function(err) {
      if(err) {console.log("...ERROR..."); return false; }
      else {console.log("...SUCCESS..."); return true; }
});

这并不能解决等待问题,因为回调可以按照自己的节奏触发。

我使用像bluebird这样的东西可以solve my problem读到这个承诺 但现在我无法获得查询的值/结果:

我一直在拉头发。请帮助我让异步工作或从promise方法中获得结果。

1 个答案:

答案 0 :(得分:0)

var async = require('async');
var sqlite3 = require("sqlite3").verbose();
var db = new sqlite3.Database("validate.db");

function check(word, callback) {
    db.get("SELECT count(1) cnt FROM tab WHERE w = ?", word, callback)  
}

async.map(words, check, function(err, results) {
    if (err)
        return console.log('Query error')

    var all_checked = results.filter(function(r) {
        return r.cnt > 0
    });
    ...
});

或者

var sqlite3 = require("sqlite3").verbose();
var db = new sqlite3.Database("validate.db");

db.all("SELECT distinct w FROM tab", function(err, rows) {
    var all_checked = words.filter(function (w) {
        return rows.indexOf(w) != -1;
    })
    ...
})