为什么 setTimeout 和 setInterval 在浏览器和 Node.js 中的工作方式不同?

Why are setTimeout and setInterval working differently in the browser and in Node.js?

let cnt=0;

let i = setInterval(() => {
  console.log(cnt++);
},200)

setTimeout(() => {
  clearInterval(i);
},2000);

在浏览器中执行此代码时记录:- 0 1 2 3 4 5 6 7 8 9

但是当使用 Node 执行时,它会记录:- 0 1 2 3 4 5 6 7 8

这是什么原因?

这是因为 Chrome does self-correct the drift in setInterval. node (and other browsers) don't. Note that currently specs agree with node, even if there is an active discussion 遵循 Chrome 的行为。

所以在 Chrome 中,就像你有一个精确的

at beginTime + 200
  do fn
at beginTime + 400
  do fn
at beginTime + 600
  do fn
...etc

而在其他情况下会是

at beginTime + 200
  do fn
  at now + 200
    do fn
    ...etc.

但我们知道总会有一些延迟阻止计时器准确地按计划启动,因此在没有漂移校正的环境中,我们最终得到的 now 比预期时间晚。

所以在Chrome中,setInterval作业会排在setTimeout作业之前,而在其他环境中,它会排在后面,因为漂移,甚至如果无穷小。