javascript - 如果条件为真,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;
}
}
解决方案
嗨 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();
推荐阅读
- java - 在另一个公共方法中调用同一类的公共方法两次
- quarkus - 本机模式下的 GraalVM Quarkus 语言环境
- apache-flink - flink作业执行过程中数据接收阶段是否需要很多时间?
- javascript - 如何使用滚动条将 div 与另一个 div 右对齐,以便第一个 div 与不包括滚动条的内容对齐
- azure - 如何更改任务的优先级?
- java - 如何将 JavaFX gradle 项目导出为独立的可执行文件进行部署?
- sql - 使用派生字段分组查询
- c++ - 如何为向量创建 getter 和 setter?
- python - 多任务学习 keras(将两个任务集成在一个多问一个中)
- node.js - SendGrid/Outlook 接收 50% 的电子邮件