Javascript 节点-来自回调的SQLite解析承诺
我在节点异步行为方面遇到问题,我有以下代码片段:Javascript 节点-来自回调的SQLite解析承诺,javascript,node.js,sqlite,Javascript,Node.js,Sqlite,我在节点异步行为方面遇到问题,我有以下代码片段: async function f(db, id) { return new Promise(function (resolve, reject) { logger.log("A"); db.run('INSERT INTO s(a,b,c,d) VALUES(?,?,?,?)', ['a', 'b', 'c', 0], function(err) { consol
async function f(db, id) {
return new Promise(function (resolve, reject) {
logger.log("A");
db.run('INSERT INTO s(a,b,c,d) VALUES(?,?,?,?)', ['a', 'b', 'c', 0],
function(err) {
console.log("B");
if(err) {
console.error(`Err:\n\t${err}`);
reject(err);
}
db.run('UPDATE t SET a = ? WHERE id = ?', [this.lastID, id],
function(err) {
console.log("C");
if(err) {
console.log(`Err:\n\t${err}`);
reject(err);
}
resolve("Done!");
}, resolve, reject, id);
}, resolve, reject, db, id);
});
console.log("D");
}
这是一个简单的基于SQLite的应用程序,其思想是在表s上插入一个条目,然后根据第一个insert查询的返回值(ID)更新表T上的一个条目,但是我不确定如何从回调内部解析返回的承诺。
调用此函数时,承诺永远不会解析,最终会被拒绝为null
称之为:
async function g(db) {
var p = f(db, "testid").catch(function(err) { console.log("ERROR: ${err}"); });
var ret = await p;
console.log(`ret: ${ret}`);
return ret
}
结果:
A
D
ERROR: null
ret: undefined
我很确定这里的问题是我的异步设计有问题,所以我有两个问题
1-为什么“B”或“C”永远不会被打印出来
2-构建此结构的正确方式是什么
关于正确的节点设计的任何材料都将受到高度赞赏,我喜欢Node.js,但我认为我在这方面做得很差。我相信您需要等待内部异步函数。或者原始的DB.run