为什么 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
作业之前,而在其他环境中,它会排在后面,因为漂移,甚至如果无穷小。
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
作业之前,而在其他环境中,它会排在后面,因为漂移,甚至如果无穷小。