@Galdar
Web, JS, PHP, NGINX, Linux

Как порешать эту проблемку?

Добрый день!
Столкнулся с такой проблемой как синхронное и асинхронное выполнение кода, как работает понимаю, но как реализовать не знаю.
return new Promise(function(resolve, reject) {

  var array = [];
  // Делаю запрос к таблице
  connection.query(" SELECT * FROM `tb_1` WHERE `id`=? ", [id], function(error, result) {
    ... // Делаю проверки и вывожу результат в виде массива
    // Далее хочу перебрать массив, чтобы записать его с отдельным типом в НОВЫЙ отдельный массив array
    for (var i in result) {
      // Начинаю перебор и сортирую записи в НОВЫЙ массив по типам
      switch (result[i]) {
        case 'type_1':
          array[result[i].id] = {
            'type_1': {}
          };
          break;
        case 'type_2':
          // ВНИМАНИЕ
          // И вдруг мне нужно сравнить значение итого типа с другой таблице!
          // Я делаю запрос к другой таблице 
          connection.query(" SELECT * FROM `tb_2` WHERE `id`=? ", [id], function(error, result_2) {
            ... // Делаю нужные мне проверки, добавляю в массив array новые записи к этому типу из таблице tb_2
            array[result[i].id] = {
              'type_2': {}
            };
          })
          break;
      }
    }
    //И так как это все в Promise, я возвращаю обещание
    resolve(array) // И вот тут возникают траблы, так как я делал асинхронный запрос к tb_2 то записи type_2 не записалась в array

  })
})

Как быть в такой ситуации?
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
bingo347
@bingo347 Куратор тега Node.js
Crazy on performance...
Вполне возможно, что connection.query из Вашей библиотеки уже умеет работать с Promise, но если это не так, то можно обернуть ее с помощью встроенной функции util.promisify:
const {promisify} = require('util');
const query = promisify(connection.query.bind(connection));


А дальше все легко решается с помощью async/await:
async function getSomethingFromDB() { // не знаю какое имя у Вас в оригинале
  const result = await query(" SELECT * FROM `tb_1` WHERE `id`=? ", [id]);
  const array = [];
  for (var i in result) {
    // ...
   const result_2 = await query(" SELECT * FROM `tb_2` WHERE `id`=? ", [id]);
    // ...
  }
}

P.S. я б вообще итераторами воспользовался (.map в частности) и результат бы вернул через Promise.all
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы