使用异步和等待处理查询

时间:2020-06-21 01:55:39

标签: javascript node.js express

使用异步和等待时出现问题。我正在执行两个查询,然后将结果保存到temp变量。收集了所有已执行查询的响应后,我会将其发送给客户端。

这是我当前的示例代码。

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
    });
  });
};

基本上,我需要等到查询解决后才能向尾发送正确的数据。

谁能解释我如何使用等待和异步来完成此任务?

谢谢。

2 个答案:

答案 0 :(得分:3)

您只能awaitPromise,因此对于不返回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.'
            });
        }
    });
};

答案 1 :(得分:0)

据我所知,我通常将异步应用于函数,并对需要从特定数据库中获取的某些变量(在函数内部)执行等待。 因此,要将其实现到包含async标签的函数中,您可以执行以下操作:

fetch1 =等待结果; fetch2 =等待结果;

这将一直等到将数据附加到变量fetch1和fetch2上,然后再继续执行代码。

很抱歉,如果它含糊不清,希望对您有所帮助。