Safari JavaScript setTimeout 在最小化时停止

Safari JavaScript setTimeout stops when minimized

这与以下内容有关:
适用于 El Capitan 的 Safari 9.1
适用于 Sierra 的 Safari 10

有谁知道当浏览器或选项卡失去焦点(主要是最小化)时,Safari 在 JavaScript 引擎中对 setTimeout() 做了什么?

我创建了一个简单的 JavaScript Web 应用程序,我在 Safari 中加载它调用 JavaScript setTimeout() 传递另一个函数以在超时值后执行。该函数将 date/time 打印到控制台,然后使用相同的超时值调用 setTimeout()。

如果Safari标签页失去焦点或浏览器最小化,一段时间后Safari似乎停止执行setTimeout,以及后续函数的调用,直到焦点返回,才执行任何函数。就好像事件循环停止处理一样。

注意:没有函数调用丢失,它们只是暂停,并在浏览器重新获得焦点时重新启动。

我在 Firefox、Chrome 或 IE11 中没有注意到这一点。

提出这个问题的主要原因是这个问题主要出现在我正在维护的 Web 应用程序中,该应用程序使用 CometD 与服务器进行通信。 CometD 库使用 setTimeout 每 30 秒执行一次返回服务器的请求。如果浏览器 运行 应用程序被最小化,CometD 似乎会停止与服务器通信,直到浏览器再次最大化。

您可能应该使用 setInterval instead, since according to this answersetInterval 仍然有效,即使它被限制为每秒 1 个。

The setInterval() method of the WindowOrWorkerGlobalScope mixin repeatedly calls a function or executes a code snippet, with a fixed time delay between each call. Returns an intervalID.

Syntax var intervalID = scope.setInterval(func, delay[, param1, param2, ...]); var intervalID = scope.setInterval(code, delay); Parameters

func A function to be executed every delay milliseconds.

code An optional syntax allows you to include a string instead of a function, which is compiled and executed every delay milliseconds. This syntax is not recommended for the same reasons that make using eval() a security risk.

delay The time, in milliseconds (thousandths of a second), the timer should delay in between executions of the specified function or code. If this parameter is less than 10, a value of 10 is used. Note that the actual delay may be longer; see "Reasons for delays longer than specified" in WindowOrWorkerGlobalScope.setTimeout() for examples.

param1, ..., paramN Optional Additional parameters which are passed through to the function specified by func once the timer expires.


Timeouts in inactive tabs clamped to >=1000ms

To reduce the load (and associated battery usage) from background tabs, timeouts are often clamped to firing no more often than once per second (1000 ms) in inactive tabs.