我正在向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的功能范围,但似乎无法实现。会不会因此而失败?我该如何解决?我已经阅读了十几篇关于异步/等待和承诺的文章和文档,但是我无法弄清楚。
答案 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.promisify将callback
包裹在promise