Использование asyn c и ожидание обработки запросов - PullRequest
0 голосов
/ 21 июня 2020

Проблемы с использованием asyn c и await. Я выполняю два запроса и затем сохраняю результат во временную переменную. После того, как я соберу ответ от всех выполненных запросов, я отправлю его клиенту.

Вот мой текущий пример кода.

module.exports = (app) => {

  app.get('/api/stats', (req, res) => {
    let fetch1 = '';
    let fetch2 = '';

    conn.query('query here', [], async (error, results) => {
      if (error) {
        return res.send({
          success: false,
          message: 'There was an error.'
        });
      } else {
         fetch1 = results;
      }
    });

    conn.query('query here', [], async (error, results) => {
      if (error) {
        return res.send({
          success: false,
          message: 'There was an error.'
        });
      } else {
        fetch2 = results;
      }
    });


    // I need to wait until the queries have resolved so that I can send the correct data
    return res.send({
      success: true,
      fetch1: fetch1,
      fetch2: fetch2
    });
  });
};

Мне в основном нужно подождать, пока запросы были решены, так что я могу отправить правильные данные ближе к концу.

Может ли кто-нибудь объяснить, как я могу использовать await и asyn c для выполнения sh этого?

Спасибо .

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Вы можете только await a Promise, поэтому для функций, которые не возвращают Promises, вам нужно создать оболочку Promise. Это нужно делать для каждого вызова, который ранее использовал обратный вызов, но вы можете создать вспомогательную функцию для каждой функции, которую нужно обернуть.

function queryPromise(query, parameters) {
    return new Promise((resolve, reject) => {
        conn.query(query, parameters, (err, results) => {
            if(err) {
                reject(err);
            } else {
                resolve(results);
            }
        });
    });
}

module.exports = (app) => {
    app.get('/api/stats', async (req, res) => {
        try {
            let fetch1 = await queryPromise('query here', []);
            let fetch2 = await queryPromise('query here', []);

            res.send({
                success: true,
                fetch1: fetch1,
                fetch2: fetch2
            });
        } catch {
            res.send({
                success: false,
                message: 'There was an error.'
            });
        }
    });
};
0 голосов
/ 21 июня 2020

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

fetch1 = await results; fetch2 = await results;

Это будет ждать, пока данные не будут прикреплены к переменным fetch1 и fetch2, прежде чем продолжить работу с кодом.

Извините, если это было очень расплывчато, надеюсь, это было несколько полезно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...