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

Shu*_*Pal 3 javascript browser settimeout setinterval node.js

let cnt=0;

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

setTimeout(() => {
  clearInterval(i);
},2000);
Run Code Online (Sandbox Code Playgroud)

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

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

这是什么原因呢?

Kai*_*ido 5

这是因为 Chrome会自我纠正setInterval. 节点(和其他浏览器)没有。请注意,当前规范与节点一致,即使有关于遵循 Chrome 行为的积极讨论。

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

at beginTime + 200
  do fn
at beginTime + 400
  do fn
at beginTime + 600
  do fn
...etc
Run Code Online (Sandbox Code Playgroud)

而在其他方面则将是

at beginTime + 200
  do fn
  at now + 200
    do fn
    ...etc.
Run Code Online (Sandbox Code Playgroud)

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

因此,在 Chrome 中,该setInterval作业将在队列中排在该作业之前setTimeout,而在其他环境中,由于漂移,即使是无限小,它也会排在后面。