setInterval重复添加相同值问题:定时检查队列值逻辑异常求助
问题分析与修复方案
原代码存在的核心问题
queue是常量无法修改
原代码用const声明queue,导致后续无法修改其值,完全无法触发“值变化时添加”的逻辑,必须改为let声明。回调内错误覆盖全局变量
回调函数里的let myData = queue创建了局部变量,直接覆盖了全局的myData数组。全局myData始终是空数组,每次判断queue !== myData(数字和数组类型不同,永远为真),所以会持续输出同一个值,且全局数组根本没被更新。逻辑不符合需求
需求是将queue的值添加到myData数组中,但原代码是直接赋值;同时判断条件错误地将数字和数组本身比较,应该检查queue是否与数组的最后一个元素不同(避免重复添加)。
修正后的代码
// 改用let允许修改queue的值 let queue = 1422; let myData = []; const queueCheck = setInterval(myCallback, 2000); function myCallback(){ // 仅当queue与myData最后一项不同时执行添加逻辑 if(queue !== myData[myData.length - 1]){ // 将queue的值添加到数组末尾 myData.push(queue); // 输出当前添加的值 console.log(queue); // 若要查看完整数组,可替换为:console.log('myData:', myData); } }; // 测试:5秒后修改queue的值 setTimeout(() => { queue = 3456; }, 5000);
修正后逻辑说明
- 将
queue改为let声明,确保后续可以修改其值。 - 回调内直接操作全局
myData数组,用push方法实现“添加”的需求。 - 判断条件改为对比
queue与myData的最后一个元素,只有当queue的值发生变化时才会执行添加操作,避免重复输出相同内容。 - 新增
setTimeout用于测试修改queue的效果,5秒后queue值变为3456,后续输出会自动切换为新值。
内容的提问来源于stack exchange,提问作者Adrin M
相关产品推荐
相关产品推荐

