在 0 秒每 5 分钟检查一次 setInterval

Checking setInterval every 5 minutes on the 0 second

const secondsInterval = () => {
  const date = getNow();
  if (dayjs(date).minute() % 5 !== 0 && dayjs(date).second() !== 0) {
    console.log("return...");
    return;
  }
  console.log("checking...");
  ...
};
// Check every second, if we're at the 5-minute interval check.
setInterval(secondsInterval, 1000);

这似乎卡住了。它在每 5 分钟标记的每一秒“检查”。我究竟做错了什么?提前致谢。

目标:每分 00 秒“检查”一次::00:00、:05:00、:10:00、、:15:00 等再次感谢。

您应该了解下一轮 5 分钟的时间。像这样:

const FIVE_MIN = 1000 * 60 * 5;

function waitAndDoSomething() {
  const msToNextRounded5Min = FIVE_MIN - (Date.now() % FIVE_MIN);
  console.log(`Waiting ${msToNextRounded5Min}ms. to next rounded 5Min.`);

  setTimeout(() => {
    console.log('It is now rounded 5 min');
    waitAndDoSomething();
  }, msToNextRounded5Min);
}

waitAndDoSomething();

如果您关心的只是每 5 分钟执行一次代码,那么就不要让它无谓地每秒执行一次,只为了 return。只需每 5 分钟(300000 毫秒)运行 让它执行您需要执行的操作,并删除所有不必要的 5 分钟标记代码检查。

const secondsInterval = () => {

  // -------------------- Remove ----------------
  //const date = getNow();
  //if (dayjs(date).minute() % 5 !== 0 && dayjs(date).second() !== 0) {
  //  console.log("return...");
  //  return;
  //}
  // -------------------- Remove ----------------

  console.log("checking...");
  ...
};
// Check every 5 mins
setInterval(secondsInterval, 300000);

你的 if 逻辑很奇怪。在这里我颠倒了它,所以 if 负责“做这件事”,而 else returns.

const secondsInterval = () => {
  const date = dayjs(new Date());
  if (dayjs(date).minute() % 5 == 0 && dayjs(date).second() == 0) {
    console.log("checking...");
  } else {
    console.log("returning...");
    return;
  }
  //...
};
// Check every second, if we're at the 5-minute interval check.
setInterval(secondsInterval, 1000);
<script src="https://unpkg.com/dayjs@1.8.21/dayjs.min.js"></script>