Node.js(.mjs)中async函数循环无法终止问题求助
问题分析与解决方案
核心问题
- 参数传递无效:调用
afk()时未传入参数,且afk函数内的message是调用时的固定值,永远不会变为!afkoff,导致终止判断完全失效。 - 局部变量无法外部控制:
breakTheLoop是afk函数的局部变量,外部的chatLog函数无法修改它来终止循环。
修复方案
将终止标记改为实例属性,让外部能直接修改,同时在chatLog中单独处理!afkoff命令:
修改后的afk函数
async afk() { // 重置终止标记,确保每次启动AFK都是全新状态 this.breakAFK = false; while (!this.breakAFK) { await new Promise(resolve => setTimeout(resolve, 500)); this.bot.setControlState('forward', true); await this.bot.waitForTicks(1); this.bot.setControlState('jump', true); let arm = Math.random() < 0.5 ? 'right' : 'left'; await this.bot.swingArm(arm); let yaw = 2*Math.random()*Math.PI - (0.5*Math.PI); let pitch = Math.random()*Math.PI - (0.5*Math.PI); await this.bot.look(yaw,pitch,false); await this.bot.waitForTicks(11); // 每次循环自动检查终止标记,无需依赖message参数 } // 循环结束后重置Bot控制状态,避免持续移动/跳跃 this.bot.setControlState('forward', false); this.bot.setControlState('jump', false); this.bot.chat("AFK模式已关闭!"); }
修改后的chatLog函数
chatLog(username, message) { if (!botNames.includes(username)) { this.log(chalk.ansi256(98)(`<${username}>`), message); if (message === '!afk') { // 启动前重置终止标记,防止旧状态干扰 this.breakAFK = false; this.afk(); this.bot.chat("我进入AFK模式了!"); } else if (message === '!afkoff') { // 修改终止标记,触发AFK循环停止 this.breakAFK = true; } } }
关键说明
- 用
this.breakAFK替代局部变量,让chatLog能直接控制循环终止 - 启动AFK时强制重置终止标记,避免之前的终止状态导致新启动的AFK直接结束
- 循环结束后重置Bot的控制状态,防止它一直保持移动或跳跃状态
- 单独处理
!afkoff命令,直接修改终止标记即可触发循环结束
内容的提问来源于stack exchange,提问作者Lil Poop
相关产品推荐
相关产品推荐

