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

如何让循环在数组无对象时停止?Node.js循环崩溃问题求助

问题分析与修复

问题场景

尝试运行while循环处理数组fila,但数组变为空数组[]时程序崩溃,原代码及报错信息如下:

原代码

const mineflayer = require('mineflayer');
let contas = require('./accounts');

let fila = []

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function main() {
  async function start(conta) {
    await sleep(1000);
    fila.logged = true;
    fila.shift();
  }

  async function queueStarter() {
    let loop = 1;
    if (fila.length >= loop && fila.length != 'undefined') {
      while (fila[0].logged == false) {
        start(fila[0]);
        await sleep(4000);
      }
    } else console.log('Reached array end')
  }

  for (key in contas) {
    let conta = contas[key];
    fila.push(conta);
  }
  queueStarter()
}
main();

控制台报错

PS C:\Users\Zwei\.vscode\IDKHowToCode> node .\StackExcample.js
C:\Users\Zwei\.vscode\IDKHowToCode\StackExcample.js:20
    while (fila[0].logged == false){
                   ^

TypeError: Cannot read properties of undefined (reading 'logged')
    at queueStarter (C:\Users\Zwei\.vscode\IDKHowToCode\StackExcample.js:20:20)

Node.js v18.12.1

崩溃原因

  • 数组为空时未终止循环:当fila被shift()清空后,fila[0]变为undefined,但while循环仍尝试访问fila[0].logged,直接触发类型错误。
  • 属性赋值错误:fila.logged = true是给数组本身加属性,而非给数组内的元素设置状态,导致fila[0].logged始终未被正确赋值。
  • 异步操作未等待:调用start(fila[0])时未加await,异步操作未完成就继续循环,数组的shift()时机混乱。
  • 冗余判断:fila.length != 'undefined'完全多余,数组length属性永远是数字类型,不可能等于字符串'undefined'。

修复后的代码

const mineflayer = require('mineflayer');
let contas = require('./accounts');

let fila = []

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function main() {
  async function start(conta) {
    await sleep(1000);
    conta.logged = true; // 给当前账号对象设置登录状态
    fila.shift(); // 移除已处理的元素
  }

  async function queueStarter() {
    // 先判断数组非空,再检查第一个元素的登录状态
    while (fila.length > 0 && !fila[0].logged) {
      await start(fila[0]); // 等待异步操作完成
      await sleep(4000);
    }
    console.log('Reached array end');
  }

  // 给每个账号初始化登录状态
  for (key in contas) {
    let conta = contas[key];
    conta.logged = false;
    fila.push(conta);
  }
  queueStarter();
}
main();

修复说明

  • 循环条件优化:while (fila.length > 0 && !fila[0].logged)先确认数组有元素,避免访问undefined的属性。
  • 属性赋值修正:把fila.logged = true改为conta.logged = true,正确给数组内的账号对象设置状态。
  • 等待异步操作:调用start时添加await,确保当前账号处理完成后再进入下一次循环。
  • 初始化状态:推入数组前给每个账号添加logged: false的初始属性,避免属性未定义问题。

内容的提问来源于stack exchange,提问作者Zwei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:45:24