Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.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/2/linux/27.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 使用精确超时设置间隔_Javascript - Fatal编程技术网

Javascript 使用精确超时设置间隔

Javascript 使用精确超时设置间隔,javascript,Javascript,有没有办法使函数与setInterval一样,但每次的超时都完全相同。 在setInterval中,超时在给定的超时范围内变化,有多一点,有少一点,但非常罕见,完全相同 例如: var before = new Date().getTime(); setInterval(function() { var after = new Date().getTime(); newTab.window.location=someURL; console.log((after - before));

有没有办法使函数与setInterval一样,但每次的超时都完全相同。 在setInterval中,超时在给定的超时范围内变化,有多一点,有少一点,但非常罕见,完全相同

例如:

var before = new Date().getTime();
 setInterval(function() {
 var after = new Date().getTime();
 newTab.window.location=someURL;
 console.log((after - before));
 before = after;
}, 50000);
打印500005002、50005、50994、50997、49999、50003、49998等。
我希望总是打印50000

Javascript仅在一个流中执行,因此如果有另一个进程同时执行某些操作,则计时器函数总是有可能无法及时执行

如果您确实需要确切的时间间隔,您可以提前阻止任何其他流程的执行,并希望做到最好:

function setExactInterval(handler, time) {
    var startTime = Date.now();
    setTimeout(function() {
        while (true) {
            var currentTime = Date.now();
            var diff = currentTime - startTime;
            if (diff >= time) {
                setExactInterval(handler, time);
                return handler();
            }
        }
    }, time - 50);
}

如果进程被操作系统阻止,它仍然是不精确的…

不。如果你想要精确到数千秒的东西,那么你需要一台时间机器,从未来获得它。我很难相信50994和50997的值,但所有其他值都是完全可以接受的。你为什么不告诉我们你的问题是什么,这样我们就可以帮你了?@Archer,我相信是50994。@fuyushimoya,对不起,我的错。那是个打字错误。我仍然发现有一个很难相信的结果——几乎是1秒外的结果?如果OP运行的是大量计算或dom操作,则可能会延迟
间隔函数,因为它们都使用相同的线程。还有@Hristo93,我认为没有这样的函数可以像你期望的那样发挥作用,也许你可以从中找到信息。请注意,这并不保证任何准确性,只保证最短的时间。浏览器可以也可以调节计时器,特别是在选项卡不活动等情况下。”注意:此API不能保证计时器完全按计划启动。CPU负载、其他任务等会导致延迟。谢谢,这确实帮助了我:)我刚刚意识到,我最初的答案是导致阻塞间隔每一步都增加。我编辑了解决方案以避免它。