问题 setInterval和长时间运行的函数


setInterval如何处理花费超过所需间隔的回调函数?

我已经读过回调可能会收到迟到的毫秒数作为它的第一个参数,但我无法找到为什么它会迟到(抖动或长时间运行的函数)。

对于常见的浏览器,它的表现有多么不同?


3610
2017-12-29 19:24


起源

好问题。我怀疑答案是浏览器特定的。我们应该进行一些测试才能找到答案吗?
我不会依赖于接收回调的任何参数。相反,使用简单的日期比较。对我来说,这似乎是最可靠和跨浏览器的方法。 - Roman Nurik


答案:


让我引用一个优秀的 文章 关于John Resig的计时器:

setTimeout(function(){
  /* Some long block of code... */
  setTimeout(arguments.callee, 10);
}, 10);

setInterval(function(){
  /* Some long block of code... */
}, 10);

这两段代码可能会出现   起初功能相同   一瞥,但他们不是。值得注意的是   setTimeout代码将始终为   在上一次之后至少延迟10ms   回调执行(它可能会结束   更多,但从不少)而   setInterval将尝试   每10ms执行一次回调   无论何时最后一次回调   被执行了。

如果间隔执行时间足够长(超过指定的延迟),则间隔可以无延迟地执行。


15
2017-12-29 19:44



因此,简而言之,因为JavaScript线程都是单线程的,所以回调不能并行运行。完善。 - Allain Lalonde