首页 > 解决方案 > 在“for”循环继续之前等待事件

问题描述

我仍在研究 Node.js Discord 机器人,我想知道是否真的有可能:

我有一个玩家列表,我在 for 循环中随机选择一个,如下所示:

let players=['foo', 'bar'];
for (let round = 0; round < players.length; round++) {
    let randPlayer = players[Math.floor(Math.random() * players.length)];

    // Events
}

之后,我正在等待使用 Discord.js 的收集器对发送的消息做出反应:

// Events
let msg = await message.channel.send('Message Here');
await msg.react('✔'); await msg.react('❌');

const filter = (reaction, user) => (user.id === randPlayer);
const ansCollector = await msg.createReactionCollector(filter, { time: 15000 });

await ansCollector.on('collect', async (reaction) => {
    // Do something
});

问题是,收集器永远无法收集,因为在触发“收集”事件之前,for 循环会跳到另一个玩家。

你有这个代码的替代品吗?

祝你有美好的一天 :D

标签: javascriptnode.jsloopseventsdiscord.js

解决方案


将您的 EventEmitter 侦听器包装在once每个玩家解析的 Promise 中,并等待承诺。

for (let round = 0; round < players.length; round++) {
    let randPlayer = players[Math.floor(Math.random() * players.length)];

    await new Promise(resolve => ansCollector.once('collect', async (reaction) => {
        resolve(reaction);
    });
    // Events
}

推荐阅读