Discord.js如何并行监听两名用户回复并实现共同超时与结果汇总
实现代码
module.exports = { name: 'd', description: 'test', async execute(client, message, args) { const Discord = require("discord.js"); const PLAYER_1_ID = 'HERE_ID_PLAYER_1'; const PLAYER_2_ID = 'HERE_ID_PLAYER_2'; const TIMEOUT = 10000; await message.channel.send("Yes or no?"); // 通用玩家选择监听函数 function getPlayerChoice(playerId, playerName) { return new Promise(resolve => { const collector = new Discord.MessageCollector( message.channel, m => m.author.id === playerId, { time: TIMEOUT } ); // 处理收集到的有效消息 collector.on('collect', msg => { const content = msg.content.toLowerCase(); if (content === 'yes' || content === 'no') { collector.stop('done'); message.channel.send(`${playerName} chose ${content.toUpperCase()}`); resolve(content); } }); // 处理收集器结束事件(含超时场景) collector.on('end', (_, reason) => { if (reason !== 'done') { message.channel.send(`${playerName}超时`); resolve('超时'); } }); }) } // 并行启动两个监听,等待全部返回结果后再往下执行 const [player1Choice, player2Choice] = await Promise.all([ getPlayerChoice(PLAYER_1_ID, '玩家1'), getPlayerChoice(PLAYER_2_ID, '玩家2') ]); // 发送最终汇总结果 await message.channel.send(`玩家1选择了${player1Choice},玩家2选择了${player2Choice}`); } }
问题解答
1. 如何在用户做出选择后从每个监听函数中获取返回结果
- 将监听逻辑包装为Promise对象,在用户提交有效回复、或者触发结束条件时调用
resolve()抛出结果,用await调用函数时就能直接拿到返回值,不需要额外声明外部全局变量存储选择结果。 - 收集到符合要求的回复后主动调用
collector.stop()终止当前收集器,避免重复收集消息。
2. 如何等待两个监听函数都执行完毕后再发送结果汇总消息
- 使用JS内置的
Promise.all()方法,把两个玩家的监听Promise作为数组传入即可。它会并行执行两个监听逻辑,完全不受玩家回复先后顺序影响,直到所有Promise都返回结果后才会继续向下执行。
3. 如何捕获超时事件,分别发送超时提示
MessageCollector实例自带end事件,事件触发时的第二个参数reason值为time时就代表是超时触发的结束,你可以在这个回调里返回对应的超时标识即可。- 两个收集器同时初始化、设置相同的超时时间,即可实现共用10秒计时的需求。
内容的提问来源于stack exchange,提问作者Dimooon
相关产品推荐
相关产品推荐

