debugging While(true)循环正在运行,但未执行?

szqfcxe2  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(121)

我写了一个循环,我想每秒运行一次,直到当前时间等于循环外指定的时间。如果时间匹配,它将记录“是时间”,并跳出循环;否则,它将在一秒钟内再次运行。
我使用node来运行文件,文件在执行时挂起,所以我必须使用CTRL+C输出,但它不会打印任何内容。
这显然是我这边的一个bug,但我不知道为什么会发生。

while (true)  { async ()=>{

    const now = new Date();
    const nowHour = now.getHours();
    const nowMinute = now.getMinutes();

    if (nowHour === hTarget && nowMinute === mTarget) {
      console.log('it is time!');
      return; // exit the loop when the target time is reached
    }
    console.log('not yet');
    // Wait for 1 second before checking again
    // to avoid excessive CPU usage
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
  }

我试过不用异步函数运行它,但我只是遇到了stackoverlow错误。

8yparm6h

8yparm6h1#

匿名函数内部的循环
把你的函数保存在一个变量中,这样你就可以把它叫做let func = async() => {
调用函数func();

const hTarget = 14;//change to test
const mTarget = 35;//change to test

let func = async() => {
  while (true) {
    const now = new Date();
    const nowHour = now.getHours();
    const nowMinute = now.getMinutes();

    if (nowHour === hTarget && nowMinute === mTarget) {
      console.log('it is time!');
      return; // exit the loop when the target time is reached
    }
    console.log('not yet');
    // Wait for 1 second before checking again
    // to avoid excessive CPU usage
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
}

func();
llew8vvj

llew8vvj2#

也许你只是在玩承诺,但对我来说,使用普通的超时似乎更简单。如果你出于某种原因需要轮询,设置超时接近所需的时间,然后当接近时(比如5或10秒),只需设置它为剩余的延迟。

// A function
function sayHi(){
  console.log('Hi ' + new Date().toTimeString().substring(0,8));
}

// Convert hr, min to milliseconds
function hmToMs(hr, min) {
  return hr*3.6e6 + min*6e4;
}

function runAt(hr, min, fn) {
  let sinceMidnight = Date.now() - new Date().setHours(0,0,0,0);
  let msLeft = hmToMs(hr, min) - sinceMidnight;
  // debug
  console.log(msLeft + ' ms left');
  
  // If more than 10 seconds left, schedule runAt again
  // when 95% of msLeft have elapsed
  if (msLeft > 1e4) {
    setTimeout(()=>runAt(hr, min, fn), msLeft * 0.95);
    
  // Otherwise, just schedule function to run at required time
  } else {
    setTimeout(fn, msLeft);
  }
}

// Run on next full minute
let d = new Date();
console.log(`Run at: ${d.getHours()} h ${d.getMinutes() + 1} min`);
runAt(d.getHours(), d.getMinutes() + 1, sayHi);

设置它在95%的剩余时间过去后运行可以避免过度轮询,也意味着计时器会在接近所需时间时更新,希望这样可以避免因等待时间过长而产生的错误。

相关问题