Javascript 后台选项卡中的Safari delay setInterval/setTimeout(间隔大于1000ms)
请注意,当页面位于后台选项卡时,Safari 10.0.3会延迟我的代码Javascript 后台选项卡中的Safari delay setInterval/setTimeout(间隔大于1000ms),javascript,safari,background,settimeout,setinterval,Javascript,Safari,Background,Settimeout,Setinterval,请注意,当页面位于后台选项卡时,Safari 10.0.3会延迟我的代码 var interval = 2000; var scriptTime = new Date().getTime(); function addTime(){ scriptTime += interval; document.getElementById('output').innerHTML = "Current state: scripts delayed by "+(new Date().getTim
var interval = 2000;
var scriptTime = new Date().getTime();
function addTime(){
scriptTime += interval;
document.getElementById('output').innerHTML = "Current state: scripts delayed by "+(new Date().getTime()-scriptTime)+"ms";
}
setInterval(addTime, interval);
试试这里:
发现了一些小时间间隔的优化确认,但没有发现大于1秒的计时器(仍然希望这只是一个bug…)。
Chrome56似乎也有类似的功能(),但不会影响我的代码
有没有其他简单的解决方案可以向服务器发送ping(30秒)?我发现让
工作者处理后台线程会有所帮助。创建另一个javascript文件:
// worker.js
const poll_url = "https://stackoverflow.com/"
setInterval(function() {
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200)
self.postMessage(xhr.responseText);
};
xhr.open("GET", poll_url, true);
xhr.send(null);
}, 5000);
在主代码中:
let worker = new Worker("worker.js");
worker.onmessage = function (data) {
// handle your poll response here
};
这将防止任何指数时间跳过。在Safari中,我见过多达4秒的延迟峰值,但从未见过持续的延迟。对于投票间隔超过5秒的任何事情,这对我来说都很有效
我已经观察到,在Chrome、Firefox和Opera中,这一点非常有效。只要worker中的函数不是太苛刻(轮询很好),就不会有明显的延迟。在Safari中,我通常希望在最早4秒的延迟中看到一些尖峰,可能是因为它切换到后台,然后变得一致
如果您需要了解潜在的延迟,可以使用递归setTimeout
并通过跟踪上一个请求的发送时间,从下一个timeout
值中减去延迟。实际上比这更糟糕。Safari将间隔限制在1000毫秒,然后增加它自己的指数延迟,每一次迭代增加一倍。我仍然无法通过可靠的方式从Safari发送ping。