Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 后台选项卡中的Safari delay setInterval/setTimeout(间隔大于1000ms)_Javascript_Safari_Background_Settimeout_Setinterval - Fatal编程技术网

Javascript 后台选项卡中的Safari delay setInterval/setTimeout(间隔大于1000ms)

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

请注意,当页面位于后台选项卡时,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().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。