思路:使用时间戳,计算延迟时间,用延迟时间抵消一部分定时器的时长
- 不做优化
let cnt = 0;
let start = Date.now();
// 耗时任务
setInterval(() => {
let num = 100000000;
while (num--) { }
});
setInterval(() => {
cnt++;
console.log("延迟:" + (Date.now() - (start + cnt * 1000)));
}, 1000);
// 延迟:106
// 延迟:176
// 延迟:286
// 延迟:416
// 延迟:523
// 延迟:602
// 延迟:676
- 优化
let cnt = 0;
let start = Date.now(), wait = 1000, delay = 0;
// 耗时任务
setInterval(() => {
let num = 100000000;
while (num--) { }
});
// 计时回调
function foo() {
cnt++;
let delay = Date.now() - (start + 1000 * cnt);
console.log("延迟:" + delay);
// 将延迟时间与计时器等待时间抵消
let newWait = wait - delay;
setTimeout(foo, newWait);
}
setTimeout(foo, wait);
// 延迟:104
// 延迟:111
// 延迟:88
// 延迟:68
// 延迟:131
// 延迟:96
// 延迟:88