javascript - Discord.JS:在循环中等待多个回复
问题描述
我正在尝试在等待客户回复的循环中实现一个函数。
只有在客户端回复后才进入下一次迭代,并且恰好运行了 3 次。
我遇到的问题是,无论何时运行该函数,它都会执行所有三个“承诺”,而无需等待前一个先完成。
我将如何解决这个问题?谢谢你。
module.exports = {
name: 'tournamentwinners',
description: 'Prepare a pretty message to showcase last tournament\'s winners',
aliases: ['trwin', 'tournwin'],
execute(client, message, args) {
const teamSize = args[0].toLowerCase();
const firstPlaceTeamMembers = new Array(teamSize);
const secondPlaceTeamMembers = new Array(teamSize);
const thirdPlaceTeamMembers = new Array(teamSize);
const filter = m => m.author.id === message.author.id;
for (let i = 0; i < 3; i++) {
message.channel.send(`Which team finished in #${i + 1}? (tag all ${teamSize} people)`).then(() => {
message.channel.awaitMessages(filter, {
max: 1,
time: 30000,
errors: ['time'],
})
.then(msg => {
msg = msg.first();
const members = msg.mentions.members.values();
for(let j = 0; members.hasNext(); j++) {
if(i == 0) {
firstPlaceTeamMembers[j] = members.next().value;
} else if(i == 1) {
secondPlaceTeamMembers[j] = members.next().value;
} else {
thirdPlaceTeamMembers[j] = members.next().value;
}
}
})
.catch(collected => {
message.channel.send('Something messed up...');
});
});
}
},
};
解决方案
在 for 循环中,你会一个接一个地触发所有的 Promise。相反,您应该使用 await 关键字。请参阅:一个接一个地解决承诺(即按顺序)?
推荐阅读
- c# - 在 Linq 中使用时,如何让我的班级表现得像 Guid?
- c# - 根据用户正在运行的分辨率转换分辨率
- python - Pytorch如何将除第一维之外的可变大小的张量相乘
- python - 如何在 Python 中实现 Thread.ResetAbort 方法
- php - Laravel 忽略用于验证电子邮件的 APP_URL
- python-3.x - 动态读取和写入字典
- apache - 为什么 Apache SVN 存储库列表显示为空?
- ios - 编译 xcode 项目时 Alamofire 的大量问题
- javascript - 如何在本地主机中显示来自 json 文件的图像?
- python - Apply on Dataframe 将第一行值传递给所有行