如何让黑手党游戏Bot等待玩家回复后再执行后续代码?
如何让Discord Bot等待玩家回复后再执行后续代码?
我正在开发一款黑手党游戏Bot,需要先询问黑手党玩家想要击杀的目标,之后再推进后续游戏流程。我编写了如下JavaScript代码:
let filter = (m) => m.author.id === Mafia.id; MafiaChannel.send("Who do you want to kill?").then(() => { MafiaChannel.awaitMessages(filter, { max: 1, time: 30000, errors: ["time"], }) .then((message) => { message = message.first(); if (message.content.toUpperCase() == `${Innocent1}`) { MafiaChannel.send(`You killed ${Innocent1}`); } else if (message.content.toUpperCase() == `${Doctor}`) { MafiaChannel.send(`You killed ${Doctor}`); } else { MafiaChannel.send("Invalid Input"); setTimeout(() => { MafiaChannel.delete(); }, 5000); } }) .catch((collected) => { MafiaChannel.send("Timeout"); }); });
目前这段代码之后的其他代码不会等待黑手党玩家回复就直接运行,请问如何实现让代码暂停直到玩家回复被记录?
解决方案
核心问题是当前代码使用链式then回调的异步写法,不会阻塞后续代码执行。要实现等待玩家回复后再继续流程,可通过async/await语法重构代码,将整个击杀询问逻辑包装在异步函数中,让后续代码等待该异步操作完成。
重构后的代码示例:
// 将黑手党击杀询问逻辑封装为异步函数 async function handleMafiaKill() { const filter = (m) => m.author.id === Mafia.id; try { // 发送击杀提问并等待消息发送完成 await MafiaChannel.send("Who do you want to kill?"); // 等待玩家回复,超时时间30秒 const collectedMessages = await MafiaChannel.awaitMessages(filter, { max: 1, time: 30000, errors: ["time"], }); const targetMessage = collectedMessages.first(); // 处理玩家回复的目标 if (targetMessage.content.toUpperCase() === `${Innocent1}`) { await MafiaChannel.send(`You killed ${Innocent1}`); } else if (targetMessage.content.toUpperCase() === `${Doctor}`) { await MafiaChannel.send(`You killed ${Doctor}`); } else { await MafiaChannel.send("Invalid Input"); setTimeout(() => { MafiaChannel.delete(); }, 5000); } } catch (error) { // 处理超时或其他异常情况 await MafiaChannel.send("Timeout"); } } // 调用异步函数,后续游戏流程代码放在then回调中(或在异步环境中直接用await) handleMafiaKill().then(() => { // 这里编写玩家完成击杀选择后才执行的后续流程 console.log("黑手党击杀阶段结束,推进游戏下一环节"); }); // 如果当前执行环境本身是异步函数,也可以直接await: // await handleMafiaKill(); // 后续流程代码...
关键说明
async/await能以同步写法处理异步操作,await会暂停函数执行,直到对应的Promise完成(玩家回复或超时)。- Discord.js中返回Promise的方法(如
send、awaitMessages)都可以用await等待完成。 - 需延迟执行的后续游戏代码,要放在
handleMafiaKill()的.then()回调内,或在异步函数中用await调用该函数后再编写,确保流程顺序正确。
内容的提问来源于stack exchange,提问作者ZeidHassan
相关产品推荐
相关产品推荐

