由于javascript 的 setTimeout 会因为事件循环问题导致不精准,有偏差
这里实现了一个精准的定时执行函数
原理:
每隔时间的一半,重新设置定时器,时间继续切分一半,相当于重新校准偏差
等时间达到1秒(根据业务服务器资源自行调控,时间越长越耗费性能)以内,死循环检测时间
function dealTimerTask(callback,time){
let dec = time - Date.now()
if(dec>1000){
console.log(`离到时间还有${dec}ms`)
setTimeout(dealTimerTask.bind(this,callback,time),Math.ceil(dec/2))
}else{
console.log(`倒计时还有1S,死循环检测`)
while(time-Date.now()>0){
// 死循环等待
}
let myTime = Date.now()
callback()
// console.log(callback)
console.log(`倒计时结束,检测时间${myTime} ${Date.now()}`)
}
}
dealTimerTask(()=>{
console.log(`测试${Date.now()}`)
},1619765640000)