定时器精度受事件循环中宏任务与微任务的调度影响,表现为回调执行时间晚于设定时间。具体做法是理解 settimeout 的回调进入宏任务队列,而 promise.then 等进入微任务队列;在定时器触发后,必须等待当前调用栈清空、所有微任务执行完毕,才能轮到宏任务执行,这引入了额外的延迟。

为什么 setTimeout 回调不会准时执行
因为 setTimeout 的回调被放入宏任务队列,只有当主线程空闲且微任务队列为空时才会执行。这意味着即使定时器到期,如果前面有耗时操作或大量微任务,回调也会被推迟。

console.log('start');
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => {
console.log('promise');
});
console.log('end');预期输出:
start
end
promise
timeout
立即学习“Java免费学习笔记(深入)”;
微任务如何进一步增加延迟
如果在定时器回调前插入微任务,它们会在宏任务之前执行,从而进一步推迟定时器的实际运行时刻。这种机制确保了高优先级的异步操作(如状态更新)先于低优先级的定时器回调完成。

console.log('start');
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => {
console.log('promise 1');
Promise.resolve().then(() => {
console.log('promise 2');
});
});
console.log('end');预期输出:
start
end
promise 1
promise 2
timeout
嵌套定时器对精度的累积影响
当使用递归方式模拟高精度定时器时,每次回调都会引入新的宏任务和可能的微任务开销,导致误差随时间累积。这是因为每次调度都重新经过事件循环的检查点,而非连续执行。


















