【问题标题】:discord.js getting each list for users for reactionsdiscord.js 为用户获取每个列表以进行反应
【发布时间】:2020-05-12 22:15:03
【问题描述】:
好的,所以我已经为此工作了一段时间,而不是我正在制作投票机器人并且卡在这部分代码上但结果不正确,似乎在控制台日志中打印了两个选项后显示用户
choices = {
"????": "yes",
"????": "No"
}
message.channel.fetchMessage(messageid ).then(r => {
r.reactions.forEach(async (H) => {
console.log(choices[H.emoji.name]);
users = await H.fetchUsers();
await users.forEach(g => {
console.log(g.username);
});
});
```
but I am getting
yes
no
bob
Sarah
luke
john
when I am trying to get
yes
bob
Sarah
luke
No
john
【问题讨论】:
标签:
javascript
foreach
bots
discord.js
【解决方案1】:
发生的情况是您的 async forEach 正在同时运行,在回调函数中等待不会阻止循环继续进行下一次迭代。每次运行时,您甚至可能会看到略有不同的结果。记录 Emoji 名称的速度非常快,因此这首先在每次迭代中完成,然后等待 fetchUsers,结果是 yes 和 no 是第一个。
一个可能的解决方法是将您的行 users = await H.fetchUsers(); 移动到循环代码的顶部,然后它甚至不会开始输出,直到它拥有所需的所有信息。您还应该知道 Collection.forEach 不会返回承诺,因此等待您的 users.forEach 是不必要的。
但是,这不是排序保证,因为 No 列表可能会在 Yes 列表之前得到输出。保证排序的一种方法是完全删除循环并在等待前一个表情符号之后处理代码中的每个表情符号。或者,您可以在一个循环中获取用户,将它们存储在一个持久集合中,同时等待 Promise.all,然后在第二个循环中输出它们,遍历所获取的存储名称。
message.channel.fetchMessage(messageid).then(r => {
let reactions = r.reactions.array();
let promises = [];
reactions.forEach(re => {
promises.push(re.fetchUsers());
}
let users = await Promise.all(promises);
for(let i = 0; i = reactions.length; i++)
{
console.log(choices[reactions[i].emoji.name]);
users[i].forEach(u => console.log(u));
}
});
【解决方案2】:
好的,在查看您的代码后,我卡在了反应[i].emoji.name undefined emoji 但如果我以这种方式编写代码,它可以工作
let reactions = r.reactions.array();
let promises = [];
reactions.forEach(re => {
promises.push(re.fetchUsers());
});
let users = await Promise.all(promises);
let i = 0;
reactions.forEach(re => {
console.log(choices[re.emoji.name]);
users[i].forEach(u => console.log(u.username));
i++;
})
});