SQLite3 的 nodejs 接口中的回调问题
Trouble with callback in nodejs interface to SQLite3
所以基本上回调应该是 运行 在我的 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");
}
}
由于某些原因,命令 each, get, all
在 运行 执行 SELECT * FROM FORWARDING
SQL 命令时不起作用。
我做错了什么?我不明白什么?
谢谢!
您正在回调函数内分配 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 库。它会让事情更容易理解,你不会以嵌套回调结束,导致人们喜欢调用 "callback hell".
所以基本上回调应该是 运行 在我的 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");
}
}
由于某些原因,命令 each, get, all
在 运行 执行 SELECT * FROM FORWARDING
SQL 命令时不起作用。
我做错了什么?我不明白什么?
谢谢!
您正在回调函数内分配 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 库。它会让事情更容易理解,你不会以嵌套回调结束,导致人们喜欢调用 "callback hell".