IwanQ
@IwanQ
Плохие времена часто дают прекрасные возможности

Не пойму ошибку в async await?

Здравствуйте.
Установил пакет mysql для работы с бд, но так как он не на промисах, решил сделать следующие.

const getDataDB = async q=>{
  return await connection.query(q, (err,result)=>{
    if(err) throw err;
    console.log(1);

    return result;
  });
};


const getData = async ()=>{
  const data = await getDataDB('SELECT * FROM users');
  console.log(2);
  console.log(data);
};

getData();


И проблема в том, что console log с цифрой 1 появляется после console log 2, т.е. getDataDB возвращает данные позже, чем getData их получает.

В консоле не пойму что выводит

<ref *1> Query {
  _events: [Object: null prototype] {
    error: [Function (anonymous)],
    packet: [Function (anonymous)],
    timeout: [Function (anonymous)],
    end: [Function (anonymous)]
  },
  _eventsCount: 4,
  _maxListeners: undefined,
  _callback: [Function (anonymous)],
  _callSite: Error


Подскажите пожалуйста, что я сделал не так?
  • Вопрос задан
  • 146 просмотров
Решения вопроса 4
Robur
@Robur
Знаю больше чем это необходимо
раз он не на промисах, то return await connection.query
сработает сразу после вызова query. await ждет промиса а его там нет. Почитайте подробнее как async/await работает.

вам нужно конвертировать это в промисы, либо через utils.promisify,
либо
const getDataDB = q=>{
  return new Promise(( resolve, reject) => connection.query(q, (err,result)=>{
    if(err) reject(err);
    console.log(1);

    resolve(result);
  }));
};
Ответ написан
mmmaaak
@mmmaaak
Посмотри что возвращает connection.query(), промис ли это, который нужен await-у. И ваще async/await придумали. чтоб избавиться от callback-ов и работы с промисами в стиле .then().catch(), а писать все в "синхронном" стиле, а тут и колбэки, и async/await, все в кучу.

И если ты сам говоришь. что библиотека не умеет в промисы, а async/await это просто синтаксический сахар для работы с промисами, как ты предполагаешь оно должно работать?
Ответ написан
Krasnodar_etc
@Krasnodar_etc
little front
connection.query() что возвращает? Промис? Если нет, то там просто нечего await-ить, и нужно обернуть этот код в промис
Ответ написан
@kttotto
все, что .NET
Потому что второй параметр в connection.query это колбэк и возврат из connection.query происходит раньше, чем выполняется этот колбэк. Т.е. произошел возврат, выполнился console.log(2), а потом только отработал колбек с console.log(1).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Aline digital agency Санкт-Петербург
от 120 000 до 300 000 ₽
Plesk Новосибирск
от 90 000 до 150 000 ₽
14 авг. 2020, в 02:27
1000 руб./за проект
14 авг. 2020, в 01:51
600 руб./за проект