我对异步函数没有经验,我想在for循环中执行请求。这是我的代码:
app.route('/friendlist').post((req, res) => {
var body = req.body;
var list = "";
con.query(`SELECT * FROM player_friends WHERE main_user_id = '${body.player_id}'`, (err, row, fields) => {
if (err) throw err;
async function queryOutUserData(data) {
var rows = await new Promise((resolve, reject) => {
con.query(`SELECT * FROM players WHERE player_id = '${data.player_id}'`, (error, player, field) => {
if (error) {
console.log(error);
return reject(error);
}
resolve(player);
});
});
rows.then(message => {
return message
});
}
for (var i = 0; i <= row.length; i++) {
console.log(row[i].main_user_id);
var result = await queryOutUserData(row[i]);
list = list + ";" + result[0].player_id + ":" + result[0].player_username;
}
console.log(list);
return list;
});
});
实际上,这是个完整的问题:我进行了一些调试,并在承诺被解决之前在for循环中显然增加了i
的值。另外,正如我提到的那样,我对异步函数不熟悉,您能为我提供有关Promise和异步函数如何工作的描述性资源吗?
谢谢
注意:为获得更好的缩进效果,请使用以下代码:https://hastebin.com/fovayucodi.js
答案 0 :(得分:0)
我建议不要使用async/await
,而是使用WHERE IN
在一个查询中进行所有操作,而不是每个玩家一个查询。查看以下内容是否满足您的需求:
app.route('/friendlist').post((req,res) => {
var body = req.body;
var list = "";
con.query(`SELECT * FROM player_friends WHERE main_user_id = '${body.player_id}'`, (err, row, fields) => {
if (err) throw err;
const playerIds = row.map(player => player.player_id);
con.query(`SELECT * FROM players WHERE player_id IN ${playerIds}`, (error, players, field) => {
for (let player of players) {
list += `;${player.player_id}:${player.player_username}`;
}
});
console.log(list);
return list;
});
});
答案 1 :(得分:-1)
如果您await
做出承诺,则评估结果为该承诺的结果,因此rows
不是承诺,它是结果 。所以这个:
rows.then(message => {return message});
没有什么意义,只要做:
return message;
此外,您在常规函数中有一个await
,这就是语法错误。
此外,return list;
并没有做很多事情(如果是明确的话),您可能想要return res.json({ list });
。
:我进行了一些调试,显然在答应被解决之前,for循环中的i会增加。
我怀疑是否由于语法错误而无法实际运行代码,就可以调试代码。
答案 2 :(得分:-1)
尝试使用for-of而不是for。
类似这样:
异步功能:
async function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(true);
return
}, 1000)
})
}
这是另一个用于等待循环结束的函数
async function myFunction() {
const data = [1,2,3,4,5,6,7,8]
for(let i of data) {
const value = await test();
console.log(value)
}
console.log("finish");
}