这与以下内容有关:
用于El Capitan的Safari 9.1
Safari 10 for Sierra
当浏览器或标签丢失焦点(主要是最小化)时,有没有人知道Safari在JavaScript引擎中对setTimeout()做了什么?
我创建了一个简单的JavaScript Web应用程序,我在Safari中加载调用JavaScript setTimeout(),它传递另一个在超时值后执行的函数。该函数将日期/时间输出到控制台,然后使用相同的超时值调用setTimeout()。
如果Safari选项卡失去焦点或浏览器被最小化,经过一段时间后,似乎Safari停止执行setTimeout,并调用后续函数,并且在返回焦点之前,不会执行任何函数。好像事件循环停止处理一样。
注意:没有函数调用丢失,它们只是暂停,并在浏览器重新获得焦点时重新启动。
我在Firefox,Chrome或IE11中没有注意到这一点。
提出这个问题的主要原因是问题主要出现在我正在维护的Web应用程序中,它使用CometD进行通信回服务器。 CometD库使用setTimeout每30秒执行一次返回服务器的请求。如果运行应用程序的浏览器被最小化,似乎CometD停止与服务器通信,直到浏览器再次最大化。
答案 0 :(得分:2)
您应该使用setInterval,因为根据this answer,setInterval
仍然有效,即使它限制为每秒1次。
WindowOrWorkerGlobalScope mixin的setInterval()方法 反复调用函数或执行带有固定的代码片段 每次通话之间的时间延迟。返回intervalID。
语法var intervalID = scope.setInterval(func,delay [,param1, param2,...]); var intervalID = scope.setInterval(code,delay); 参数
func 每延迟毫秒执行一次的函数。
代码可选语法允许您包含字符串而不是函数, 每延迟毫秒编译和执行一次。这个语法 不建议使用与使用eval()a相同的原因 安全风险。
延迟时间,以毫秒为单位(千分之一秒) 第二个),计时器应该在指定的执行之间延迟 功能或代码。如果此参数小于10,则值为10 用过的。请注意,实际延迟可能会更长;见“原因 延迟超过指定的“in WindowOrWorkerGlobalScope.setTimeout()例如。
param1,...,paramN 可选附加传递给的参数 计时器到期后由func指定的函数。
非活动标签中的超时限制为> = 1000毫秒
从背景中减少负载(以及相关的电池使用量) 标签,超时通常被限制为每次发射不超过一次 非活动标签中的第二个(1000毫秒)。