Javascript setInterval方法是否等待(至少)两次执行特定代码之间的指定时间间隔,还是在完成上一次执行和下一次执行开始之间等待该时间间隔?
(或者,当与Java的ScheduledExecutorService
方法进行比较时 - setInterval类似于scheduleAtFixedRate()
或更确切地说scheduleWithFixedDelay()
?)
答案 0 :(得分:5)
如果您使用 1000 毫秒间隔调用setInterval
并且回调代码需要 100 毫秒才能运行,则在 900之后将执行下一个回调强>毫秒。
如果回调需要 1050 毫秒,则下一个回调将在第一个完成后立即启动( 50 毫秒延迟)。这种延迟会不断积累。
因此在Java世界中,这类似于scheduleAtFixedRate()
。如果您需要scheduleWithFixedDelay()
行为,则必须使用setTimeout()
并在每次完成时重新安排回调:
function callback() {
//long running code
setTimeout(callback, 1000);
}
setTimeout(callback, 1000);
上面的代码将在callback()
完成之后等待1000毫秒,然后再次启动它,无论运行多长时间。
答案 1 :(得分:1)
这个答案包括以下jfriend00评论的帮助。
Javascript是单线程的,因此同一个函数不能同时运行两次。但是,setInterval延迟不会考虑运行该函数所需的时间。
例如,假设你的setInterval函数需要500毫秒才能运行,你的延迟是1000毫秒。这将在函数再次启动之前导致500毫秒的延迟。
答案 2 :(得分:0)
正如您在this jsFiddle test case中看到的那样,setInterval会尝试保持时间间隔,无论在该时间间隔上运行的代码需要多长时间,只要该代码花费的时间少于设置的时间间隔。因此,如果您将间隔设置为5秒并且在每个间隔上运行的代码需要200毫秒,则每个间隔应该相隔5秒(或者与单个线程javascript引擎一样接近5秒)。
另一方面,如果在每个时间间隔上运行的代码花费的时间长于执行时间间隔本身,因为javascript是单线程的,以下时间间隔将不会按时启动,并且由于时间超限而会延迟第一个区间的代码。
通过调整延迟时间,可以在此工作测试案例中看到这两种情况。
在此处运行测试用例:http://jsfiddle.net/jfriend00/kGQsQ/