我们知道js是单线程的,加上event loop的机制,拿setInterval拿来做倒计时,往往是不准确的。
大概思路是这样的:我们使用setTimeout,假设间隔时间是1000毫秒执行一次,如果这次延迟了700毫秒,那下一次执行的时间就为300毫秒,如果延迟超过1000毫秒,那下次执行时间就为0毫秒。
var startTime = new Date().getTime();
var count = 0;
setInterval(function () {
var i = 0;
while (i++ < 800000000) {
}
}, 0);
// 纠正误差
function fixed() {
count++;
// 延迟毫秒数
var offset = new Date().getTime() - (startTime + count * 1000);
// 下一次触发时间
var nextTime = 1000 - offset;
if (nextTime < 0) {
nextTime = 0;
}
setTimeout(fixed, nextTime);
console.log(offset)
}
setTimeout(fixed, 1000);