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

Node.js(.mjs)中async函数循环无法终止问题求助

问题分析与解决方案

核心问题

  1. 参数传递无效:调用afk()时未传入参数,且afk函数内的message是调用时的固定值,永远不会变为!afkoff,导致终止判断完全失效。
  2. 局部变量无法外部控制: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:20:32