Javascript setInterval-速率或延迟
Javascript setInterval - rate or delay?
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/
- 可以简化嵌套的延迟Q Promises解析吗
- onclick函数需要双击,因为类分配延迟
- 更多延迟动画
- 对父作用域的指令更新延迟了一步
- 为JS函数添加延迟
- 带有延迟的循环每次应运行5次
- 关键帧之间的css3动画延迟
- 如何在有延迟的情况下对两个代码进行积分
- 如何为.css状态的更改添加延迟
- Angular.js延迟控制器初始化
- 在延迟时设置Whois脚本
- 如何在Javascript中延迟setInterval
- 如何在一个元素动画之后延迟
- 如何将一个方法延迟到另一个方法首先完成,javascript
- jQuery延迟了ajax调用的循环
- 如何减少在移动网络应用程序上播放声音的延迟
- 如何将GreaseMonkey中的XMLHttpRequest延迟到目标页面加载完成
- 实现延迟的jquery更改事件处理程序
- 延迟高亮显示文本区域中的文本
- Javascript setInterval-速率或延迟