2017-02-03 16 views
0

したがって、基本的にコールバックはSQLコマンドの終了後に実行する必要がありますが、何らかの理由でコールバックが実行されることはありません。nodejsインタフェースのコールバックでSQLite3へのトラブル

これは私が現在持っているコードです:それはSELECT * FROM FORWARDING SQLコマンドを実行していることになると、コマンドeach, get, allが動作しないいくつかの理由について

create : function() { 
    var hit = false; 
    this.db.serialize(function() { 
     this.run("CREATE TABLE if not exists messages (phone_from CHAR(20) NOT NULL, phone_to CHAR(20) NOT NULL, message TEXT)"); 
     this.run("CREATE TABLE if not exists forwarding (phone_1 CHAR(20) NOT NULL, phone_2 CHAR(20) NOT NULL, phone_bind CHAR(20) NOT NULL)"); 

     this.get("SELECT * FROM FORWARDING;", function(err, row) { 
      hit = true; //<--- Why is this never being hit? 
     }); 

    }); 
    if (hit) { 
     this.insert_forwarding("+180","+18003214321","+18005432322"); 
     console.log("Inserted initial forwarding address"); 
    } 

} 

私は間違っていますか?私は何を理解していないのですか?

ありがとうございました!

答えて

0

hit = trueをコールバック関数内に割り当てていますが、hit == trueが同期しているかどうかを確認しています。 ifステートメントの後にコールバックが実行されるため、条件は決してtrueになりません。

これを試すことができますか?

create : function() { 
    var hit = false; 
    this.db.serialize(function() { 
     this.run("CREATE TABLE if not exists messages (phone_from CHAR(20) NOT NULL, phone_to CHAR(20) NOT NULL, message TEXT)"); 
     this.run("CREATE TABLE if not exists forwarding (phone_1 CHAR(20) NOT NULL, phone_2 CHAR(20) NOT NULL, phone_bind CHAR(20) NOT NULL)"); 

     this.get("SELECT * FROM FORWARDING;", function(err, row) { 
      if (err) { // throw error } 
      else { 
       hit = true; // I guess you don't even need this flag 
       if (hit) { 
       this.insert_forwarding("+180","+18003214321","+18005432322"); 
       console.log("Inserted initial forwarding address"); 
       } 
      } 
     }); 
    }); 
} 

PS:私は間違いなくbluebirdのようなものを使用するか、ネイティブES6は離れて、コールバックパターンと、使用しているpromisify sqliteのライブラリーから移動することを約束します。理解するのがはるかに簡単になり、ネストされたコールバックで終わらず、結果として人々が "コールバック地獄"と呼ぶようになります。

関連する問題