Узел / Mysql асин c данные - PullRequest
       5

Узел / Mysql асин c данные

1 голос
/ 02 марта 2020

Я бы хотел видеть сообщения по порядку (раз, два, три, четыре). Потому что на данный момент мой скрипт не работает, потому что запрос не успевает завершиться asyn c и жду, но я не понимаю, где и как использовать

function dropAll() {
  console.log("ONE");

  db.query("SHOW tables", (err, result) => {
    result.map(async list => {
      db.query(`DROP TABLE \`${list.Tables_in_gcd_updt}\``, (err, results) => {
        console.log(list.Tables_in_gcd_updt + " REMOVED");

        console.log("TWO");
      });
    });
  });
}

function getAll() {
  console.log("FOUR");
}

const infiniteQuestion = function() {
  prompt.question("What do you want to your DB project ?", answer => {
    switch (answer) {
      case "drop":
        dropAll();
        console.log("THREE");
        getAll();
        infiniteQuestion();
        break;
      case "exit":
        console.log(`${answer} unknow`);
        rl.close();
        process.exit(0);
      default:
        infiniteQuestion();
    }
  });
};

infiniteQuestion();

Спасибо

Ответы [ 2 ]

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

Если вы хотите дождаться окончания первой асинхронной функции / инструкции до sh перед выполнением второй асинхронной функции / инструкции, вы должны поместить вторую функцию / инструкцию в обратный вызов первой. В итоге вы получите вложенный обратный вызов. Код демонстрации с использованием обещаний.


    function foo1()
      .then(el12 => {
        //logic for foo1
        function foo2()
          .then(ele2 => {
          //logic for foo2})
        })
    })

Второй вариант - использовать async / await.

async function main(){
   await function foo1()
   await function foo2()
}
0 голосов
/ 02 марта 2020

Как вы и думали, здесь необходимо использовать async / await, так как выполнение вашего dropAll метода асинхронно.

Вы можете обратиться к этой документации , чтобы понять, как работает асинхронность Следует использовать / await.

Ваш пример может быть обновлен до следующего:

async function dropAll() {
  console.log("ONE");

  await db.query("SHOW tables", async (err, result) => {
    await result.map(async list => {
      db.query(`DROP TABLE \`${list.Tables_in_gcd_updt}\``, (err, results) => {
        console.log(list.Tables_in_gcd_updt + " REMOVED");

        console.log("TWO");
      });
    });
  });
}

function getAll() {
  console.log("FOUR");
}

const infiniteQuestion = async function() {
  await prompt.question("What do you want to your DB project ?", async answer => {
    switch (answer) {
      case "drop":
        await dropAll();
        console.log("THREE");
        getAll();
        return infiniteQuestion();
      case "exit":
        console.log(`${answer} unknow`);
        rl.close();
        process.exit(0);
      default:
        return infiniteQuestion();
    }
  });
};

infiniteQuestion();
...