Javascript / Node.js и контекст функций [дубликат]

251
19 февраля 2018, 04:47

На данный вопрос уже ответили:

  • Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания 3 ответа

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

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) => { ... }, результат тот же.

Answer 1

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

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

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

READ ALSO
Как функции вернуть ответ на AJAX-запрос?

Как функции вернуть ответ на AJAX-запрос?

Как сделать чтобы getData() возвращала не undefined, а содержимое строки 36?

232
Не могу вывести таблицу из js в html

Не могу вывести таблицу из js в html

Получаю с сервера информацию, заполняю массивы и пытаюсь вывести таблицу в html, но выдаёт ошибку"Cannot set property 'innerHTML' of null"Перемещение скрипта...

449
ckeditor onchange - почему мой код срабатывает 2 раза?

ckeditor onchange - почему мой код срабатывает 2 раза?

ЗдравствуйтеНастраиваю ckeditor

203
React - растет кол-во “бесполезного” кода

React - растет кол-во “бесполезного” кода

Есть контейнер, который подключен к Redux'уЭтот контейнер, по сути, управляет всем приложением

188