ettaluni
@ettaluni
ERROR MEME

Help me вдупить промисы?

Есть модульный код построенный на классах. Есть главный класс рекварит все другие модули и создает объекты на основе этих классов.Цепочка вызовов большая. Делал все на await\async. Но в одном участке кода все проскакивает, await не работает. Есть две функции которые находятся почти рядом с друг другом:
await isNew();
/*
    Code

*/
await prepeare();

В первом случае когда в обоих этих функциях не было промиса, код работы с базой данных пропускался переходило все к «Метке 2» и завершало работу. База была 0кб.

Во втором случае я в функцию prepare добавил promise на участок с запросами к БД. Код останавливается на «Метке 1».

После я еще добавил promise, в функцию isNew(). И теперь функция Prepare вообще не выполняется. Да что уж там сама функция isNew() не до конца выполняется. Программа завершает свою работу.

На этом моменте я понял что перестал что-то понимать… Кто нибудь объясните пожалуйста, как заставить работать программу нормально, без этих попрыгунчиков а как в нормальных языках последовательно. Не предлагайте сменить язык, это последний проект на JS, больше я к нему не вернусь. Спасибо!
async isNew() {
    let res = false;
    let deDB = this.deDB;

    await new Promise((resolve, reject) => {
        deDB.each("SELECT id, dt FROM meta", function(err, row) {
            console.log(err);
        if (err)
            res = true;
        //console.log("User id : "+row.id, row.dt);
        });
    });
    console.log('res is ' + res);

    return res;
}
async prepare() {
    let sSql = new Array();
    let deDB = this.deDB;

    await new Promise((resolve, reject) => {
        deDB.serialize(async function() {
            deDB.run("CREATE TABLE meta (id INT, dt TEXT)");
            deDB.run("CREATE TABLE lorem (info TEXT)");

            console.log('i am in prepare');

            let stmt = deDB.prepare("INSERT INTO lorem VALUES (?)");
            for (let i = 0; i < 10; i++) {
                await stmt.run("Ipsum " + i);
            }
            stmt.finalize();
            console.log('Метка 1');
        });
    });
        
    console.log('Метка 2');
    await deDB.close((err) => {
        if (err) {
            return console.error(err.message);
        }
            console.log('Close the database connection.');
        }
    )

    console.log('Метка 3');

    return true;
}
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Вот вы создали промис new Promise((resolve, reject)..., но надо же его изнутри когда-нибудь таки отресолвить! Внутри промиса вызвать resolve(result)

Промис — часовая бомба. Которая не сразу, но должна либо рвануть resolve(), либо сдуться reject().

result = await my_promise; прост дожидается, пока промис рванёт с каким-то результатом.
Ответ написан
function isNew() {
  // !!! Обязательно нужно вызвать один из callback
  return new Promise((resolve, reject) => {
    deDB.each("SELECT id, dt FROM meta", function(err, row) {
      if (err) {
        // этот вызовит отрицательный результат, который можно обраюатывать в цепочке c catch
        reject(err)
      } else {
       // этот вызовит положительный результат, который можно обраюатывать в цепочке c then
        resolve(row)
      }
    });
  });
}

try {
  const result = await isNew()
  console.log(result)
} catch (e) {
  console.log('Ошибка:', e)
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы