setTimeout/setInterval实现倒计时,会出现时间点偏差,请问如何处理这种问题?
重点就是你的setTimeout回调函数执行的时机,比较说倒计时,每次我们的回调函数执行时,都要获取当前时间,与函数执行完毕之后的时间,它们两个时间的差就是你的函数执行时间,然后再用1s减去函数执行时间,就是下次setTimeout执行的时机;
不建议用setInterval,假如函数执行时间较长,则会跳过一次执行。建议用setTimeout递归的方式实现
setTimeout、setInterval 属于定时触发器线程属于macrotask,它的回调会受到GUI渲染、事件触发、http请求、等的影响。所以这两个不适合做精准的定时。最好的方法是定时矫正,用new Date(targetDate:Date - new Date )格式化成你需要的时分秒即可。
function countDown(){
// todo ...
const time = new Date().getTime();
const timer = time % 1000;
setTimeout(countDown, timer);
}
countDown();
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答4.9k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
setTimeout的间隔时间不要写死,每次setTimeout的时候计算一下实际的间隔时间,从而修正下一次的间隔时间。