// 传统的定时器使用setInterval
// 想要实现一个比较准的定时器,我们使用setTimeout
// 核心原理是,每次执行下一个定时器之前,都去获得执行代码的耗时误差
// offset = new Date().getTime() - ( startTime + count*interval )
// 那么下一次定时器的时间为 currentInterval = interval - offset
let timeFragment = 60*1000*60*2
let startTime = new Date().getTime()
let endTime = startTime + timeFragment
let interval = 1000
let currentInterval = interval
let count = 0
console.log(startTime)
function loop(){
count++
let offset = new Date().getTime() - ( startTime + count * interval )
currentInterval = interval - offset
let hTime = 60*1000*60*2 - count * interval
let h = Math.floor(hTime / (60*60*1000))
let mTime = hTime % (60*60*1000)
let m = Math.floor(mTime / (60 * 1000))
let sTime = mTime % (60*1000)
let s = Math.floor(sTime / 1000)
console.log(`倒计时 ${h} 小时 ${m} 分 ${s} 秒`+'代码执行时间:'+offset, '下次循环间隔'+currentInterval) // 打印
setTimeout(loop, currentInterval)
}
setTimeout(loop, currentInterval)
console