我们可以想象一个场景,在一些购物中心,我们会发现倒计时越来越慢,所以我们需要继续F5刷新的目的是向服务器要求最新的倒计时数据。在这个时候,我们可以考虑为什么会成这种情况的原因是什么?这是因为我们在前端从服务端要求倒计时数据,js它也是单线程语言,所以我们每次都使用它setTimeout和setInterval倒计时是将其放入任务队列,等待主线程执行。如果主线程有大量耗时的操作,此时会造成延迟问题。
//时间间隔 const interval = 1000 //总时间 let totalTime = 20000 //用来计数次数 let count = 0 ////开始倒计时时间 let lastTimer = new Date().getTime() let timer = null timer = setTimeout(func, interval) function func() {
count let delaytimer = new Date().getTime() - (interval * count lastTimer) if (delaytimer < 0) {
delaytimer = 0 } let nextTimer = interval - delaytimer totalTime -= interval console.log(`当前延迟了${
delaytimer}ms, 下一次执行${
nextTimer}ms, 还剩下${
totalTime}ms。`) if (totalTime <= 0) {
clearTimeout(timer)
} else {
timer = setTimeout(func, nextTimer)
}
}
上述代码的原理是:记录当前时间和理论时间之间的时间间隔,并不断对下一次定时器时间进行校正。