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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:45:00