【问题标题】:While loop not executing right if conditions even if they are true如果条件为真,While 循环不会正确执行
【发布时间】:2021-12-12 19:53:51
【问题描述】:

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

例如变量normalWeek如果是早上6点就为真,但是即使不是早上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;
    }
}

【问题讨论】:

  • 如果我对问题的理解正确,您需要在 eloop 中调用 getHours 和 getDay 来检查它是否在上午 6:00 之后。
  • 同意arp5。小时和日变量没有得到更新。另外,while循环是否循环?在 true 或 false 时,b 会递增,这将打破循环。只是为了测试吗?
  • 实际的问题是,在其中一个 if 条件为真之后,即使在所述条件变为假之后,循环也将始终选择执行相同的条件。例如。 normalWeek 变量只有在上午 9 点才为真(我知道 normalWeek 变量在我的代码中具有不同的值,只是使用上午 9 点更容易解释),如果时间过去了,现在是上午 10 点,那么 normalWeek 为假,但正常周继续当它应该是假的时候,就好像它是真的一样被执行,并执行另一个条件。
  • 我只是改了,如果使用while,但它总是有同样的问题
  • 现在您已经创建了内部while 循环,您的continue 语句将无休止地重复内部循环。暂时忽略你写的代码,你希望你的程序最终做什么?

标签: javascript if-statement time while-loop conditional-statements


【解决方案1】:

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

// 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();

【讨论】:

  • 谢谢,我还有一个问题,我需要 24/7 运行此代码,但我无法在我的计算机上执行此操作,是否可以使用服务器?
  • 是的,您可以使用 JavaScript 运行时在服务器上运行它,例如 DenoNode.js。但是,这是一个不同的问题,因此您可能需要在 StackOverflow 上搜索该问题或询问一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多