首页 > 解决方案 > 如果条件为真,While 循环不会正确执行

问题描述

我的变量normalWeek等于某个时间段,如果这个时间段为真,那么第一个条件将被执行,如果不是,while循环将执行第二个条件,直到变量normalWeek变为真。但问题是,当我执行代码时,循环发现为真的第一个条件将是唯一执行的条件,即使在另一个条件变为真之后也是如此。

例如,如果是早上 6 点,变量normalWeek为真,但即使不是早上 6 点,循环也会继续执行相同的条件,它基本上忽略了其他条件。

var date = new Date();
var hour = date.getHours();
var day = date.getDay();
var minute = date.getMinutes();


function goodSignal() {
    console.log(b, 'Good Signal');
}
function badSignal() {
    console.log(b, 'Bad Signal');
}
function sleep(miliseconds) {
    var currentTime = new Date().getTime();
 
    while (currentTime + miliseconds >= new Date().getTime()) {
    }
}

let b = 0;

let normalWeek = (hour === 6 || hour === 10) && (day > 0 && day < 6);

while (b === 0) {
    console.log('Testing Started...');

    while (normalWeek === true) {
        b++;
        goodSignal();
        sleep(10000);
        continue;
    }
    
    while (normalWeek === false) {
        b++;
        badSignal();
        sleep(10000);
        continue;
    }
}

标签: javascriptif-statementtimewhile-loopconditional-statements

解决方案


嗨 Iago:看看下面的代码:我在评论中包含了解释。它说明了如何每次使用新日期而不是重复使用同一日期来检查“正常周”。我已尽力解释您的问题的目标,但如果您想澄清某些事情,请在评论中告诉我,我会检查出来。

// This will compute a new date every time instead of using the same date each time
function isNormalWeek () {
  const date = new Date();
  const day = date.getDay();
  const hours = date.getHours();
  // return (hours === 6 || hours === 10) && (day > 0 && day < 6);

  // Just for this example, let's say it's normal if the seconds are even
  // instead of waiting for 06:00-06:59 or 10:00-10:59 on a weekday
  const seconds = date.getSeconds();
  return seconds % 2 === 0; // seconds are even
}

// This is preferable to running a loop endlessly for no reason
function sleep (ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function main () {
  function goodSignal () {
    console.log(b, 'Good Signal');
  }
  
  function badSignal () {
    console.log(b, 'Bad Signal');
  }

  let b = 0;

  // Always true, loop forever
  while (true) {
    b += 1;

    // Invoke one function if the week is "normal", otherwise invoke the other
    isNormalWeek()
      ? goodSignal()
      : badSignal();

    // await sleep(10_000);

    // Just for this example, let's run the loop again after waiting one second
    // instead of waiting ten seconds
    await sleep(1_000);
  }
}

main();


推荐阅读