提问者:小点点

在“for”循环继续之前等待事件


我还在做一个Node.js Discord bot,我想知道一些事情是否真的可能:

我有一个玩家列表,我在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循环在“collect”事件被激发之前跳过到另一个播放器。

对于这个代码,你有其他的选择吗?

祝你有愉快的一天


共1个答案

匿名用户

将您的EventEmitter侦听器包装在每个播放器解析一次的Promise中,并等待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
}