【发布时间】:2019-08-01 16:46:23
【问题描述】:
众所周知,JavaScript 中的超时会受到限制every 4ms on an active tab and every 1000ms on an inactive one。根据浏览器和配置的不同,此行为可能会略有变化,但通常是相同的。
为了完整起见,我将在此处引用相关部分:
超时限制为 >=4ms
在现代浏览器中,
setTimeout()/setInterval()调用在由于回调嵌套(嵌套级别至少为一定深度)或在特定数量之后触发连续调用时至少每 4 毫秒一次连续的间隔。
我想通过在默认 Chrome 实例上使用这个 sn-p 来向某人证明这一点:
let beforeStartingTheInterval = Date.now();
let intervalId = setInterval(()=>{
let msPassed = Date.now()-beforeStartingTheInterval;
if (msPassed > 20) clearInterval(intervalId); // stop after 20 ms
console.log( msPassed + "ms have passed after starting the interval")
}
,0);
几乎每次我运行该代码时,我都会得到以下输出:
1ms have passed after starting the interval
2ms have passed after starting the interval
3ms have passed after starting the interval
4ms have passed after starting the interval
8ms have passed after starting the interval
12ms have passed after starting the interval
16ms have passed after starting the interval
20ms have passed after starting the interval
可以看出,间隔是(通常)前四次每毫秒运行一次,之后每 >=4ms 运行一次。
为什么对于前 4 次执行,调用没有受到限制?我期望这个输出:
4ms have passed after starting the interval
8ms have passed after starting the interval
12ms have passed after starting the interval
16ms have passed after starting the interval
20ms have passed after starting the interval
或者至少一个在任意两次执行之间至少有 4 毫秒(甚至是第一次执行)
【问题讨论】:
标签: javascript browser setinterval throttling