You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让黑手党游戏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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:18:26