为什么setTimeout的启动时间早于它应该启动的时间

Why is setTimeout firing earlier than it should?

本文关键字:时间 启动 于它应 setTimeout 为什么      更新时间:2023-09-26

我有一些node.js代码如下:

var start = Date.now();
setTimeout(function() {
    console.log(Date.now() - start);
    for (var i = 0; i < 100000; i++) {
    }
}, 1000);
setTimeout(function() {
    console.log(Date.now() - start);
}, 2000);

当我在机器上运行它时,会发生一些奇怪的事情。我得到的时间在970到980之间,在1970到1980之间。为什么我得到的时间早于超时时间?

我相信您遇到这些问题是因为日期精度。它可能因平台和浏览器而异。

以下是关于Date准确性的更详细的解读。

一些平台上有更多的高精度计时器,但您通常必须进行一些混合和匹配(检测可用的计时器并相应地进行回归)。

来自node.js setTimeOut文档:

需要注意的是,您的回调可能不会被调用在精确的延迟毫秒内-Node.js不能保证回调将触发的确切时间,以及排序的确切时间事情会突然发生。回调会被调用得尽可能接近到指定的时间。

然而,有一个纳米计时器可以玩:
https://www.npmjs.org/package/nanotimer

一些相关问题:

  • node.js setTimeout分辨率非常低且不稳定
  • 为什么node.js处理setTimeout(func,1.0)不正确

然而,我确实认为提前+/-30ms有点多(与我玩过的大多数浏览器相比,它们通常不会超过10ms(只要cpu没有耗尽))。