javascript - 在“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
解决方案
将您的 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
}
推荐阅读
- python - 将 setuptools_scm 从 6.0.1 升级到 6.3.1 后检查清单失败
- python-3.x - 如何从也具有 NaN 的 CSV 文件中导入列表类型?
- javascript - 如何在单击角度 11 中来自 ngfor 循环的图像时切换特定 div
- autodesk-forge - 使用新的 AggregatedView 时出现问题,我需要此类的使用示例
- r - geom_smooth() 创建多条线,可能是美学问题
- c# - 为列表的每个字符串添加尾随 # 会导致 #//
- python - 是否有可能使以下时间序列静止,以便将 AR 或 ARMA 模型拟合到此类时间序列?
- sql - 如何在 oracle sqlplus 终端中查看 varchar2 列的全部内容?
- nginx - NGINX“40:不允许代理证书,请设置适当的标志”
- html - 为什么 SVG 标签没有按预期工作