Javascript 如何将节点sqlite3与q(promise)一起使用
我正在尝试使用sqlite3的承诺。以下是我源代码的一部分:Javascript 如何将节点sqlite3与q(promise)一起使用,javascript,sqlite,promise,Javascript,Sqlite,Promise,我正在尝试使用sqlite3的承诺。以下是我源代码的一部分: this.deleteTag=函数(标记,项目){ var db=this.db; 国际单项体育联合会(项目){ 返回q.nfcall(db.run,“从tag2project中删除,其中tag=?和project=?”, [tag.id,project.id]); }否则{ 返回q.all([ q、 nfcall(db.run,“从tag2project中删除,其中tag=?”,[tag.id]), q、 nfcall(db.run
this.deleteTag=函数(标记,项目){
var db=this.db;
国际单项体育联合会(项目){
返回q.nfcall(db.run,“从tag2project中删除,其中tag=?和project=?”,
[tag.id,project.id]);
}否则{
返回q.all([
q、 nfcall(db.run,“从tag2project中删除,其中tag=?”,[tag.id]),
q、 nfcall(db.run,“从id=?”的标记中删除,[tag.id])
]);
}
};
但这些承诺只有在出现错误时才生效。失败:
[类型错误:应为数据库对象]
搜索这个错误只能找到sqlite本身的源代码
使用简单回调的旧版本正在运行,因此this.db或sql查询中没有错误。我认为db.run不是函数,而是方法。从Q文档: 如果您使用的是方法,而不是简单的函数,那么您可以 很容易遇到将方法传递给另一个方法的常见问题 类似于Q.nfcall的函数-“取消绑定”方法的所有者。避 在这方面,您可以使用Function.prototype.bind或其他更好的方法 我们提供的快捷方式:
return Q.ninvoke(redisClient, "get", "user:1:id");
return Q.npost(redisClient, "get", ["user:1:id"]);
但我总是使用Q.denodeify或Q.nbind。它更干净
您还可以使用Q.denodeify或Q.nbind创建可重用包装器:
var readFile = Q.denodeify(FS.readFile);
return readFile("foo.txt", "utf-8");
var redisClientGet = Q.nbind(redisClient.get, redisClient);
return redisClientGet("user:1:id");
您可以绑定在提示函数时创建的对象 范例
const{promisify}=require('util');
const db=new lib_sqlite3.Database(_dirname+'/your db path');
const runAsync=promisify(db.run.bind(db));