如何让循环在数组无对象时停止?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
相关产品推荐
相关产品推荐

