Chrome(和其他浏览器)如何在浏览器选项卡隐藏且不活动时处理设置为高于 1000 毫秒的“setTimeout”?

How does Chrome (and other browsers) handle a “setTimeout” set to higher than 1000 milliseconds when a browser tab is hidden and inactive?

我正在调试一个由外部供应商为客户维护的网站上的一些 login/logout 问题,希望标题能说明问题,但更多细节在下面。

据我了解,Chrome 中隐藏选项卡中的任何 JavaScript 运行 都会将任何 setTimeout 的值更改为 1000 毫秒以维护整个系统性能而不浪费资源。作为 explained on this site:

“Browsers do exactly this. For inactive tabs, they automatically throttle timers to run every 1 second, regardless of the original delay specified in the code. For example, if the code originally used setInterval() to run some code every 50 ms, once the application is moved to a background tab, the interval automatically becomes 1000 ms (1 second).”

对于设置为低于 1,000 毫秒(如 50 毫秒等)的 setTimeout 值,这绝对有意义。但是高于 1,000 毫秒的值呢?

即使 900,000 毫秒(又名:900 秒,又名:15 分钟)明显高于该值,Chrome 是否会将 setTimeout 值设置为 1,000 毫秒?

这是供应商网页中的一段代码,我认为它导致了我试图协助调试的问题。它在隐藏选项卡中时不起作用。

function keepSessionAlive() {
    if (externalAdminWindow && externalAdminWindow.closed) {
        externalAdminWindow = null;
    }
    if (externalFGWindow && externalFGWindow.closed) {
        externalFGWindow = null;
    }
    if (externalAdminWindow || externalFGWindow) {
        $find("ctl00_RadAjaxManager1").ajaxRequest("KeepAlive");
        setTimeout(function() {
            keepSessionAlive();
        }, 900000);
    }
}

大多数浏览器 节流 非活动选项卡超时。这意味着所有 setTimeout 的超时时间至少为 1000 毫秒。比这更长的一切都应该按预期工作。所以,回答你的问题,15 分钟超时应该不会受到影响。

查看 MDN 上 setTimeout 非活动选项卡超时 部分:https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#timeouts_in_inactive_tabs