JavaScript的while循环条件变更后仍执行原分支、判断逻辑异常问题
问题根因分析
- 时间状态仅初始化计算一次:
hour、day、normalWeek这些和时间相关的变量仅在脚本启动时计算了一次,后续循环过程中没有重新获取最新时间、更新变量值,所以条件判断永远用的是脚本启动时的结果,不会随时间变化。 - 循环逻辑结构错误:内部两个
while只要进入任意一个,就会执行b++,导致外层while(b === 0)的条件直接失效,再也不会进入外层逻辑,同时内部while的判断条件也不会更新,会永远卡在当前分支。
修复方案
首先需要把时间获取、normalWeek 计算的逻辑放到循环内部,每次执行都获取最新时间;其次不需要嵌套多层while,直接在外层循环里做条件判断即可。
修复后的代码如下:
function goodSignal(b) { console.log(b, 'Good Signal'); } function badSignal(b) { console.log(b, 'Bad Signal'); } // 同步sleep仅用于和原有逻辑对齐,浏览器/Node环境更推荐用异步setTimeout实现非阻塞等待 function sleep(miliseconds) { var currentTime = new Date().getTime(); while (currentTime + miliseconds >= new Date().getTime()) {} } let b = 0; while (true) { console.log('Testing Started...'); // 每次循环都获取最新时间 const date = new Date(); const hour = date.getHours(); const day = date.getDay(); const normalWeek = (hour === 6 || hour === 10) && (day > 0 && day < 6); b++; if (normalWeek) { goodSignal(b); } else { badSignal(b); } sleep(10000); }
补充说明
如果是在浏览器或者Node.js生产环境使用,不推荐用同步阻塞的sleep实现,会阻塞整个线程的其他任务执行,可以改成异步定时器的写法,避免线程阻塞。
内容的提问来源于stack exchange,提问作者Iago Romao
相关产品推荐
相关产品推荐

