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

window.setInterval窗口非活跃60秒后停止,如何使其持续运行至手动终止?

窗口不可见时setInterval停止的解决方法

这是Chrome等浏览器的后台资源优化策略导致的——当窗口或标签页处于不可见状态时,浏览器会大幅降低定时器的执行频率,甚至在约60秒后暂停setInterval,以此节省CPU和电池消耗。而调试模式下浏览器会关闭这个优化机制,所以定时器能正常运行。

下面提供两种解决思路:

方法1:使用Web Worker(最可靠)

Web Worker运行在独立的后台线程,完全不受页面可见性的影响,定时器能稳定按设定频率执行。

  1. 新建一个Worker文件(例如timer-worker.js),写入定时器逻辑:
let startTimeMs;

self.onmessage = function(e) {
  if (e.data === 'start') {
    startTimeMs = Date.now();
    setInterval(() => {
      const elapsed = Math.round((Date.now() - startTimeMs) / 1000);
      self.postMessage(`TX at ${elapsed}`);
    }, 1000);
  }
};
  1. 主线程中调用Worker:
function pseudoBot2() {
  const worker = new Worker('timer-worker.js');
  worker.postMessage('start');
  
  // 接收Worker发送的日志并打印
  worker.onmessage = function(e) {
    console.log(e.data);
  };
  
  // 手动停止时执行:worker.terminate();
}

方法2:修正时间计算(适合简单场景)

如果不想使用Worker,可以通过计算实际时间差来修正日志显示的时间,但这种方法无法让定时器真正每秒执行一次,只是能保证日志里的时间是准确的(浏览器后台仍会限制触发频率):

function pseudoBot2() {
  const startTimeMs = Date.now();
  let nextExecuteTime = startTimeMs + 1000;

  function logIt() {
    const now = Date.now();
    const elapsed = Math.round((now - startTimeMs) / 1000);
    console.log(`TX at ${elapsed}`);

    // 调整下一次执行时间,补回延迟
    nextExecuteTime += 1000;
    setTimeout(logIt, Math.max(0, nextExecuteTime - now));
  }

  setTimeout(logIt, 1000);
}

内容的提问来源于stack exchange,提问作者George Keeling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:25:07