У меня проблемы с асинхронным поведением узла, у меня есть следующий фрагмент:
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, а затем обновить запись в таблице T на основе возвращаемого значения (ID) из первого запроса на вставку, однако я не уверен, как разрешить возвращенное обещание из-за обратного вызова. При вызове этой функции обещание никогда не разрешается и в итоге получает отклонение с нулем.
Вызов его с помощью:
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 также был бы высоко оценен, я люблю Node.js, но я думаю, что я довольно плох в этом.