Javascript 为什么setTimeout的触发时间比应该的要早?

Javascript 为什么setTimeout的触发时间比应该的要早?,javascript,node.js,serverside-javascript,Javascript,Node.js,Serverside Javascript,我有一点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); var start=Date.now

我有一点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);
var start=Date.now();
setTimeout(函数(){
console.log(Date.now()-start);
对于(变量i=0;i<100000;i++){
}
}, 1000);
setTimeout(函数(){
console.log(Date.now()-start);
}, 2000);

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

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

这是关于日期准确性的更详细的解读


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

我相信由于日期精度,您会遇到这些问题。它可以因平台和浏览器而异

这是关于日期准确性的更详细的解读


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

我相信由于日期精度,您会遇到这些问题。它可以因平台和浏览器而异

这是关于日期准确性的更详细的解读


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

我相信由于日期精度,您会遇到这些问题。它可以因平台和浏览器而异

这是关于日期准确性的更详细的解读


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

来自node.js
setTimeOut

请务必注意,您的回调可能不会被调用 在精确的延迟毫秒内-Node.js不保证 回调将触发的确切时间,以及顺序 事情会发生的。将尽可能近距离调用回调 到指定的时间

然而,有一种纳米计时器可以使用:

一些相关问题:


然而,我确实认为提前+/-30ms有点多(与我玩过的大多数浏览器相比,它们通常不超过10ms(只要cpu没有达到最大),也就是说)

请务必注意,您的回调可能不会被调用 在精确的延迟毫秒内-Node.js不保证 回调将触发的确切时间,以及顺序 事情会发生的。将尽可能近距离调用回调 到指定的时间

然而,有一种纳米计时器可以使用:

一些相关问题:


然而,我确实认为提前+/-30ms有点多(与我玩过的大多数浏览器相比,它们通常不超过10ms(只要cpu没有达到最大),也就是说)

请务必注意,您的回调可能不会被调用 在精确的延迟毫秒内-Node.js不保证 回调将触发的确切时间,以及顺序 事情会发生的。将尽可能近距离调用回调 到指定的时间

然而,有一种纳米计时器可以使用:

一些相关问题:


然而,我确实认为提前+/-30ms有点多(与我玩过的大多数浏览器相比,它们通常不超过10ms(只要cpu没有达到最大),也就是说)

请务必注意,您的回调可能不会被调用 在精确的延迟毫秒内-Node.js不保证 回调将触发的确切时间,以及顺序 事情会发生的。将尽可能近距离调用回调 到指定的时间

然而,有一种纳米计时器可以使用:

一些相关问题:



然而,我确实认为提前+/-30毫秒有点多(与我玩过的大多数浏览器相比,它们通常不会超过10毫秒(只要cpu没有达到最大值即可))。

在哪个浏览器中?Safari返回1002和2001这样的数字,在Chrome和Firefox中类似。首先,你应该删除
for
循环–在JS中使用这样的结构从来都不是一个好主意。JS中没有等效的
sleep
函数,尝试使用这种长时间运行的循环创建类似的效果完全是胡说八道,几乎在所有情况下都会导致不可预测或不可靠的结果。我分别得到1002和2002。这只是示例代码,实际上我正在linux机器上运行它,没有在任何浏览器中运行它。我在那里有一个循环,只是为了模拟一个需要时间的事件。我在Windows上的node.js上运行了你的代码,得到了两个我期望的数字:
1015
2001
,这两个数字在两个计时器被设置为启动时非常接近。现在,我想说你的数字是不可复制的。在哪个浏览器中?Safari返回1002和2001这样的数字,在Chrome和Firefox中类似。首先,你应该删除
for
循环–在JS中使用这样的结构从来都不是一个好主意。JS中没有与
sleep
函数等价的函数,试图使用这种长时间运行的循环来创建类似的效果完全是胡说八道,几乎在所有情况下都会导致不可预测或不可靠的结果。我分别得到1002和2002。这只是示例代码,实际上我正在我的计算机上运行