Javascript setInterval-速率或延迟

Javascript setInterval - rate or delay?

本文关键字:延迟 速率 setInterval- Javascript      更新时间:2023-09-26

Javascript setInterval方法是(至少)在两次执行特定代码之间等待指定的间隔,还是在完成上一次执行和开始下一次执行之间等待该间隔?

(或者,与Java的ScheduledExecutorService方法相比,setInterval类似于scheduleAtFixedRate()还是scheduleWithFixedDelay()?)

如果以1000毫秒的间隔调用setInterval,并且回调代码运行100秒,则下一次回调将在900分钟后执行。

如果回调花费1050毫秒,则下一个回调将在第一个回调完成后立即启动(具有50微秒延迟)。这种延迟将不断累积。

所以在Java世界中,这类似于scheduleAtFixedRate()。如果您需要scheduleWithFixedDelay()行为,则必须使用setTimeout()并在每次回调完成时重新安排回调:

function callback() {
    //long running code
    setTimeout(callback, 1000);
}
setTimeout(callback, 1000);

上面的代码将在callback()完成后等待1000毫秒,然后再启动它,无论它运行了多长时间。

这个答案包括下面jfriend00评论的帮助。

Javascript是单线程的,因此同一个函数不能同时运行两次。但是,setInterval延迟没有考虑运行函数所需的时间。

例如,假设您的setInterval函数运行需要500毫秒,而您的延迟是1000毫秒。这将导致在功能再次启动之前出现500毫秒的延迟。

正如您在这个jsFiddle测试用例中所看到的,setInterval试图保持时间间隔,无论在该时间间隔上运行的代码需要多长时间,只要该代码所花费的时间少于设置的时间间隔。因此,如果您将间隔设置为5秒,并且在每个间隔上运行的代码需要200ms,那么每个间隔仍然应该间隔5秒(或者与单线程javascript引擎所能达到的5秒一样接近)。

另一方面,如果您在每个间隔上运行的代码执行所需的时间比间隔本身长,因为javascript是单线程的,那么接下来的间隔将不会按时启动,并且会因为第一个间隔的代码超时而延迟。

这两种情况都可以通过调整延迟时间在这个工作测试用例中看到。

此处的工作测试用例:http://jsfiddle.net/jfriend00/kGQsQ/