Узел - SQLite разрешает обещание от обратного вызова - PullRequest
0 голосов
/ 16 марта 2020

У меня проблемы с асинхронным поведением узла, у меня есть следующий фрагмент:

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, но я думаю, что я довольно плох в этом.

1 Ответ

0 голосов
/ 16 марта 2020

Полагаю, вам нужно дождаться внутренних асин c функций. или оригинальный DB.run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...