You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何停止并重启用于时间检测的无限循环函数

如何停止并重启用于时间检测的无限循环函数

兄弟,你遇到的问题核心是没正确保存和使用定时器的ID!clearTimeout() 接收的参数不是你写的函数本身,而是每次调用 setTimeout() 时返回的唯一定时器ID,所以你之前直接传 infiniteloop 肯定没用~

我给你调整一下代码,保证能正确停止旧循环再启动新的:

第一步:保存定时器ID

先在函数外部定义一个变量来存定时器ID,这样我们能随时拿到它来取消定时器:

// 在合适的作用域(比如全局或组件实例内)定义定时器ID变量
let timerId;

第二步:修改循环函数,更新定时器ID

每次调用 setTimeout() 时,把返回的ID赋值给 timerId,这样后续就能精准清除它:

function infiniteloop(){
  let now = moment();
  const start = moment(myStartTime); // 建议加const,避免意外修改变量
  const end = moment(myEndTime);

  if (now.isBetween(start, end)) {
    console.log('This is happening now')
  } else  {
    console.log('This is not happening now')
  }

  // 把新的定时器ID存起来
  timerId = setTimeout(infiniteloop, 5000);
}

第三步:封装重启逻辑

当 myStartTime 或 myEndTime 变化时,调用这个重启函数就行:

function restartLoop() {
  // 如果之前有正在运行的定时器,先清除它
  if (timerId) {
    clearTimeout(timerId);
  }
  // 启动新的循环
  infiniteloop();
}

第四步:初始化和触发重启

  • 页面渲染时,直接调用 infiniteloop() 启动第一次循环;
  • 当你的时间变量变化时(比如用户修改了开始/结束时间),调用 restartLoop() 就能停止旧循环,启动新的了!

为啥之前的方法没用?因为每个 setTimeout() 都会生成一个独立的定时器,只有通过它返回的ID才能精准取消对应的定时器,直接传函数是找不到要取消的定时器的,自然就会出现多个循环同时运行的情况~

备注:内容来源于stack exchange,提问作者Torf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:27:57