【问题标题】:Node.js function not waiting despite async / await and Promise.all [duplicate]尽管 async / await 和 Promise.all [重复],Node.js 函数没有等待
【发布时间】:2020-07-10 06:36:51
【问题描述】:

我完全被异步/等待所困。我尝试了多种方法,但无法得到我需要的东西。情况如下:

async function mainfunction(){

var returned_result = [];

var client = mysql.createConnection(config);
    
client.connect(function(err){
    if(err){
      console.log('Error connecting to Db');
      client.end();}
});

var query_result = await client.query(sql, async function(err, rows) {

    ...

    var result = await secondFunction(client);

    ...

});

returned_result.push(query_result);
var returned_result_confirmation = await Promise.all(returned_result);
client.end();
return returned_result_confirmation;

}

我的目标是在调用 client.end(); 之前等待 secondFunction 完成。但它的行为并非如此。

你有什么指点吗?

非常感谢!

【问题讨论】:

  • await 仅在您等待承诺时才做任何有用的事情。所以,如果你想使用await,你必须确保你使用的API会返回一个promise。要将 Promise 与 mysql 一起使用,您将需要 mysql2,然后您必须按照文档中的说明将其与 Promise 一起使用。而且,您不会将普通回调传递给返回承诺的 API(因为这是多余的)。因此,安装 mysql2 并阅读有关如何将其与 Promise 一起使用的文档。然后,只有这样,你才能使用await。仅供参考,关于同一主题还有数百个其他问题。

标签: mysql node.js async-await


【解决方案1】:

你可以把整个事情包装成一个承诺:

var query_result = await new Promise((resolve, reject) => {
    client.query(sql, async function(err, rows) {
        ...
        secondFunction(client)
            .then(data => resolve(data))
            .catch(err => reject(err))
        ...
});

或者(我猜不是那么好,但也会这样做):

var query_result = await new Promise((resolve, reject) => {
    client.query(sql, async function(err, rows) {
       ...
       resolve(await secondFunction(client))
       ...
});

【讨论】:

  • 获取这个已经内置promise支持的数据库版本比手动promisify每个你想使用的db操作要好。 mysql2/promise 已内置承诺支持。
  • 绝对!不知道框架,所以我选择了通用方法:-)
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 2020-03-30
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多