0

Добрый день. Есть следующий код. (упрощен)

function first_func(somedata) {
  if (somedata == true) {
    let data = {};

    mysql.query('SELECT * FROM test WHERE id = 1', function(err, results, fields) {
      data['id'] = results[0].id;
      data['name'] = results[0].name;
    });

    console.log(data); // {}
  }
}

first_func(true);

Не могу добавить данные в data. При этом я понял что либо теряется контекст, либо вызов console.log идет до записи данных. Пробовал делать стрелочную функцию (err, results,fields) => { ... }, результат тот же.

Veles
  • 167
  • 1
    Контекст ни при чем (можно проверить сделав вывод данных внутри колбека), код асинхронный, по этому console.log() отрабатывает раньше, чем в объект добавляются данные. – MedvedevDev Feb 17 '18 at 13:11

1 Answers1

0

Проблема в от что mysql.query асинхронная функция по ее окончанию вызывается callback в то время когда вызовится callback уже отработает console.log(data);

проще говоря код выполняется последовательно но не ожидает но не ожидает окончания работы mysql.query

Как вариант можно mysql.query завернуть в promise и использовать async/await, ну или более изощренные способы.

  • Как вариант, мне кажется, больше подходит, если console.log поместить внутрь каллбэка функции mysql.query – Dmytro Feb 17 '18 at 15:40
  • @Дмытрык смотря что человеку надо, если в место console.log return то нет, если просто обработка данных то может быть. – Igor Ognichenko Feb 17 '18 at 19:17