好吧,所以我有一个调用MySQL数据库的函数,获取一些信息并用它来做任务。然后它应该比较它。该函数是异步的,但问题是调用MySQL数据库的部分在For循环中,当我尝试await
时,它表示" await仅在异步函数中有效&#34 ;
async function savePosition(con) {
let IDs = [];
let finished = false;
con.query(`SELECT * FROM Callers;`, (err, callers) => {
if (err) throw err;
if (callers.length < 1) throw 'No callers';
for (let i = 0; i < callers.length; i++) {
let maxCalls = -1;
let maxID = "";
let maxLast = "";
for (let j = 0; j < callers.length; j++) {
const uID = callers[j].id;
let isWritten = false;
for (let a = 0; a < IDs.length; a++) {
if (uID == IDs[a]) isWritten = true;
}
if (isWritten) continue;
con.query(`SELECT * FROM Callers WHERE id = '${uID}';`, (e, curr) => {
if (e) throw e;
if (Number(curr[0].calls) > maxCalls) {
maxID = curr[0].id;
console.log(maxID)
maxCalls = curr[0].calls;
}
})
}
IDs[i] = maxID;
console.log("maxid" + maxID);
con.query(`UPDATE Callers SET position = ${i + 1} WHERE id = '${maxID}';`);
}
})
}
从以下代码中,输出为:
maxid
some id
正如我所说,如果我将await
放在con.query()
行中,则会出现错误&#34; Await仅在异步函数&#34;中有效。我怎样才能解决这个问题?我希望它首先定义maxID,然后在控制台中将其写入
完整错误是:
C:\...\Sentry\cmds\setkills.js:33
await con.query(`SELECT * FROM Callers WHERE id = '${uID}';`, (e, curr) => {
^^^^^
SyntaxError: await is only valid in async function
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:616:28)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at jsFiles.forEach (C:\...\Sentry\bot.js:93:20)
在bot.js
第93行:
let properties = require(`./cmds/${file}`);
第92行:
jsFiles.forEach((file) => {
编辑:包含完整功能。
答案 0 :(得分:1)
我已经使用了承诺然后实现了这一目标。
var Promise = require('promise');
....
function savePosition(con) {
let getMaxId = ()=>{
return new Promise((resolve,reject)=>{
let maxID;
let counter=callers.length-1;
for (let i = 0; i < callers.length; i++) {
con.query(`SELECT * FROM Callers WHERE id = '${uID}';`, (e, curr) => {
if (e)
throw e;
if (Number(curr[0].calls) > maxCalls) {
maxID = 'some id';
maxCalls = curr[0].calls;
}
if(counter===0) resolve(maxID);
else couonter--;
})
}
})
}
getMaxId().then((maxID)=>{
IDs[i] = maxID;
console.log("maxid" + maxID);
con.query(`UPDATE Callers SET position = ${i + 1} WHERE id = '${maxID}';`);
})
}
答案 1 :(得分:1)
以下是使用promises和async/await
的最新代码版本,以允许您使用与异步查询一起使用的更多同步编码样式:
const util = require('util');
async function savePosition(con) {
con.queryPromise = util.promisify(con.query);
let IDs = [];
let finished = false;
let callers = await con.queryPromise(`SELECT * FROM Callers;`);
if (callers.length < 1) throw new Error('No callers');
for (let i = 0; i < callers.length; i++) {
let maxCalls = -1;
let maxID = "";
let maxLast = "";
for (let j = 0; j < callers.length; j++) {
const uID = callers[j].id;
let isWritten = false;
for (let a = 0; a < IDs.length; a++) {
if (uID == IDs[a]) isWritten = true;
}
if (isWritten) continue;
let curr = await con.queryPromise(`SELECT * FROM Callers WHERE id = '${uID}';`);
if (Number(curr[0].calls) > maxCalls) {
maxID = curr[0].id;
console.log(maxID)
maxCalls = curr[0].calls;
}
}
IDs[i] = maxID;
console.log("maxid" + maxID);
await con.queryPromise(`UPDATE Callers SET position = ${i + 1} WHERE id = '${maxID}';`);
}
}
你会这样称呼:
savePosition(con).then(() => {
console.log("savePosition() completed successfully");
}).catch(err => {
console.log("Error in savePosition(), err);
});