使用我的功能之一时:
async function fetchServerChance(serverID) {
var returnValue;
con.query("SELECT chance FROM serversConfigs WHERE serverID = '"+serverID+"' LIMIT 1", function (err, rows) {
if (err) throw err;
returnValue = (rows[0].chance);
});
return returnValue;
}
console.log(await fetchServerChance(message.guild.id));
它只返回“未定义”,请有人以上帝的名义解释我应该做什么。我试过做很多事情,比如 return await returnValue;
并让其他一些行在其中包含 await
。
答案 0 :(得分:0)
您当前的代码是这样工作的
async function fetchServerChance(serverID) {
var returnValue; // 1
con.query("SELECT chance FROM serversConfigs WHERE serverID = '"+serverID+"' LIMIT 1", function (err, rows) {
if (err) throw err;
returnValue = (rows[0].chance); // 4
}); // 2
return returnValue; // 3
}
1 - returnValue
在函数顶部声明,其值为 undefined
2 - con.query() 正在调用 MySQL(但立即返回并在结果准备好时调用提供的函数)
3 - 函数返回 undefined
,它是 returnValue
4 -(一段时间后)returnValue
更新为查询结果(但没有任何东西可以使用该值)
您无法更改上述执行顺序。 con.query()
是异步的,但不会向您返回 Promise(因此您不能在那里停止执行并为结果 await
)。函数需要返回一些东西,而它还没有结果。
您可以将 con.query()
包装成一个 Promise 并返回它。这将弥合 MySQL 库 API(接受回调函数)之间的差距,并允许使用 async/await 方法。
async function fetchServerChance(serverID) {
const returnValue = new Promise(function (resolve, reject) {
con.query(
// serverID value will be escaped for safety and put into ? placeholder
// see https://github.com/mysqljs/mysql#escaping-query-values
"SELECT chance FROM serversConfigs WHERE serverID = ? LIMIT 1", [serverID],
function (err, rows) {
// promise will be rejected if error happens (async function can catch the error with try/catch clause
if (err) { reject(err) };
// promise will resolve to value of chance
resolve(rows[0].chance);
}
);
});
return returnValue; // promise of future value
}
附言
有关 Promise 的更多信息:Promise、Making asynchronous programming easier with async and await
附言
这是一个常见问题,因此有 promise-mysql
库可以执行上述操作(返回 Promises)并允许将 MySQL 查询重写为 const rows = await con.query("QUERY")