为什么设置的超时会因页面重新加载而失效以及如何避免?

Why are set timeouts invalidated by a page reload and how to avoid it?

我有一个网站,我使用 Javascript 自动循环导航以模仿用户的操作。

对于出现问题并且循环停止工作的情况,我有一个故障保护机制。在每次迭代中执行以下代码:

var failsafe = function () {
    console.log("Something went wrong, reloading...");

    window.location.reload();
    document.failsafeTimeout = setTimeout(failsafe, 60000);
};

if (document.failsafeTimeout !== undefined) {
    // the previous iteration went fine, clearing the old timeout

    clearTimeout(document.failsafeTimeout);
}

document.failsafeTimeout = setTimeout(failsafe, 60000);

问题是,代码没有像我预期的那样工作。当循环中断时,故障安全处理程序被调用一次,但是,尽管被再次设置,但再也不会被调用。故障安全处理程序完成执行后,document.failsafeTimeoutundefined。我假设 window.location.reload() 异步工作,这会在分配后破坏 failsafeTimeout 属性。

我如何重写故障安全超时处理程序,以便它可以设置一个新的超时,该超时将在页面重新加载后继续存在?

window.location.reload() 完全重新加载页面,这会中断任何 javascript 调用。

您仍然可以通过侦听 onunload 事件获得一些代码 运行,但不要期望代码在会话之间持续存在(或者您必须事先在 cookie 或 localStorage 中序列化数据)