Safari JavaScript setTimeout在最小化后停止

时间:2017-01-20 16:25:57

标签: javascript safari settimeout cometd

这与以下内容有关:
用于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停止与服务器通信,直到浏览器再次最大化。

1 个答案:

答案 0 :(得分:2)

您应该使用setInterval,因为根据this answersetInterval仍然有效,即使它限制为每秒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毫秒)。