2016-08-30 9 views
1

Dies ist mein erstes persönliches Projekt in Nodejs. Ich versuche, bald reinzukommen. Ich habe einen Nodejs-Server, der sqlite3 verwendet. Es gibt nur 3000 Zeilen mit Wort, Transformation und einem vorberechneten Wert jeweils in einer Spalte der Tabelle, die bereits gefüllt ist.nodejs erhalten sqlite3 Abfrage Ergebnis mit Versprechen oder warten

Ich muss nur das Wort in der DB nachschlagen, um sicherzustellen, dass es gültig ist.

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

Das Problem ist, dass der Aufrufer dieses Codes viel Kontext hat und die Operation warten muss. Also, habe ich das versucht

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

Dies löst nicht die Wartezeit, da der Rückruf in seiner eigenen Geschwindigkeit auslösen kann.

las ich dieses Versprechen so etwas wie drossel kann solve my problem verwenden, aber jetzt bin ich den Wert/Ergebnis der Abfrage, um aus nicht in der Lage:

so lange meine Haare

Ich habe ziehen. Bitte helfen Sie mir, entweder das asynchrone Arbeiten zu erhalten oder das Ergebnis vom Versprechen-Ansatz zurückzubekommen.

Antwort

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 
    }); 
    ... 
}); 

Oder

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

Dank. Ich habe deine erste Annäherung versucht. Ich fügte 'var all_checked = false;' genau über 'async.map (Wort's Wort ist eine einzelne Zeichenkette, und entfernte 'var' von' var all_checked = results.filter' hinzu. Dann fügte ich 'console.log() hinzu: ", all_checked);' nach 'async.map (...});' und es gibt '[]' aus, also keine Ergebnisse. Sieht so aus als wäre ich wieder bei demselben Problem. Ich frage mich, ob ich Bluebird benutze Versprochen stattdessen, kann ich '.get()' auf Verheißung verwenden, um Abfrageergebnis zu erhalten? –

+0

Daten nur verfügbar '...' Orte, weil Knoten async. Also, hinzugefügt 'console.log' ist kein Ergebnis zurück. Versprochen Beispiel hier - http://bluebirdjs.com/docs/api/promise.all.html –