0

所以基本上应该在我的 SQL 命令完成后运行回调,但由于某种原因,回调永远不会执行。

这是我目前拥有的代码:

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("+18001231234","+18003214321","+18005432322");
        console.log("Inserted initial forwarding address");
    }

}

由于某种原因,这些命令在运行SQL 命令each, get, all时不起作用。SELECT * FROM FORWARDING

我究竟做错了什么?我不明白什么?

谢谢!

4

1 回答 1

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("+18001231234","+18003214321","+18005432322");
                console.log("Inserted initial forwarding address");
              }
            }
        });
    });
}

PS:我肯定会使用类似bluebird或原生 ES6 Promises 的东西来摆脱promisify你正在使用的回调模式和 sqlite 库。这将使事情更容易理解,并且您不会以嵌套回调结束,从而导致人们喜欢称之为“回调地狱”。

于 2017-02-04T09:13:22.333 回答