递归 setTimeout 调用神秘停止 运行

Recursive setTimeout calls mysteriously stop running

我想连续调用 JavaScript 中的函数,例如每 5 秒调用一次,直到发生取消事件。 我尝试使用 setTimeout 并在我的函数中调用它

function init()
  {  setTimeout(init, 5000); 

  // do sthg
  }

我的问题是调用在大约 2 分钟后停止,而我的程序有点长,大约 5 分钟。

我怎样才能一直调用我的函数,只要我想。

提前致谢

那个函数叫做setInterval

var interval = setInterval(init, 5000);

// to cancel
clearInterval(interval);

对于您所描述的行为,唯一可以想到的解释是:

  1. 正如另一位发帖者所提到的,init 在执行过程中以某种方式被覆盖,在代码的 // do sthg 部分

  2. 正在重新加载页面。

  3. //do sthg 代码进入某种错误状态,这使得它看起来好像没有执行。

为保证 init 未被修改,请尝试将 // do sthg 部分作为函数传递,我们将调用 callback:

function startLoop(callback, ms) {
    (function loop() {
        if (cancel) return;
        setTimeout(loop, ms);
        callback();
    }());
}

其他发帖者建议使用 setInterval。很好,但是有
使用 setTimeout 设置重复操作并在您执行操作时函数本身发出下一个 setTimeout 从根本上没有错。它是设置重复操作的常见且广为接受的替代方法。除其他优点外,它还允许根据行为调整后续超时,尤其是超时间隔(如果这是一个问题)。如果要使用 requestAnimationFrame 重写代码,因为它可能应该如此,那么除了在回调中发出下一个请求外别无选择,因为 requestAnimationFrame 没有 setInterval 模拟。