节点js等待似乎没有等待

时间:2019-01-08 15:25:19

标签: node.js asynchronous scope

我正在向mySQL数据库发出请求,并希望使用返回的结果。我有异步功能

async function doQuery(query) {
  try {
    console.log('0. connection start');
    var connection = MySQL.createConnection({  
      host: "xxxxxxxx",
      user: "yyyyyyyy",
      password: "zzzzzzzz"
    });

    console.log('1. Connection set up. Connecting...');
    var queryResults;
    await connection.connect(function(err) {
      if (err) console.log(err);
      console.log("2. Connected!");
      connection.query(query, function(err, result) {
        if (err) console.log(err);
        queryResults = JSON.parse(JSON.stringify(result));
        console.log("3. " + util.inspect(result, {depth: 4}));
        console.log("3.5 " + util.inspect(queryResults, {depth: 4}));
        connection.end();
      });
    })

    console.log ("results before return:" + JSON.stringify(queryResults));
    return queryResults;
  }
  catch (err){
    console.log("async err: " + err);
  }
}

然后从另一个函数调用该函数:

function handle async(handlerInput) {
  console.log("ExecuteDBSearchHandler");

  var query = buildQuery(handlerInput);
  try{
    var resultsPromise = doQuery(query)
      .then(results => {
        console.log("4. final results: " + results);
        const count = results.length;
        var speechText = 'Abfrage Erfolgreich, es gab ' + count + " Ergebnisse.";
        return handlerInput.responseBuilder
          .speak(speechText)
          .withSimpleCard('Abfrage Erfolgreich', speechText)
          .withShouldEndSession(false)
          .getResponse();
      })
  }
  catch (err){
    console.log("error:" + err);
  }
}

此代码将用于nodejs Alexa技能中。函数运行时,我希望日志中的输出按升序排序。我一直得到的输出是0、1、4、2、3、3.5。 .then部分在建立实际连接和查询数据库之前执行。

而不是.then,我之前尝试了一次简单的等待,使行开始

var results = await doQuery(query);

这导致完全相同的结果。我对为什么等待实际上没有等待感到困惑。旁注:在块内

connection.query(query, function (err, result) {
  if (err) console.log(err);
  queryResults = JSON.parse(JSON.stringify(result));
  console.log("3. " + util.inspect(result, {depth: 4}));
  console.log("3.5 " + util.inspect(queryResults, {depth: 4}));
  connection.end();
});

queryResults显示结果(在调试日志步骤3.5中)。在行

console.log ("results before return:" + JSON.stringify(queryResults));  

它返回未定义。我做了很多尝试,以使结果达到doQuery的功能范围,但似乎无法实现。会不会因此而失败?我该如何解决?我已经阅读了十几篇关于异步/等待和承诺的文章和文档,但是我无法弄清楚。

1 个答案:

答案 0 :(得分:1)

您需要将回调函数包装在Promise中,以使用await关键字

例如:

async function dbQuery(query) {
    try {
        const connection = MySQL.createConnection({  
            host: "xxxxxxxx",
            user: "yyyyyyyy",
            password: "zzzzzzzz"
        });

        return new Promise(function(resolve, reject) {
            connection.connect(function(err) {
                if (err) reject(err);

                connection.query(query, function (err, result) {
                    if (err) reject(err);
                    connection.end();
                    resolve(JSON.parse(JSON.stringify(result)));
                });
            });
        });
    } catch {
        console.error("async err: " + err);
    }
}

一个人也可以使用util.promisifycallback包裹在promise