JS 是單線程的钉迷,所以 setTimeout 的誤差其實(shí)是?法被完全解決的,原因
有很多钠署,可能是回調(diào)中的糠聪,有可能是瀏覽器中的各種事件導(dǎo)致。這也是為什么
??開久了谐鼎,定時(shí)器會(huì)不準(zhǔn)的原因舰蟆,當(dāng)然我們可以通過?定的辦法去減少這個(gè)
誤差。
// 以下是?個(gè)相對準(zhǔn)確的倒計(jì)時(shí)實(shí)現(xiàn)
var period = 60 * 1000 * 60 * 2
var startTime = new Date().getTime();
var count = 0
var end = new Date().getTime() + period
var interval = 1000
var currentInterval = interval
function loop() {
count++
var offset = new Date().getTime() - (startTime + count * interval); // 代碼
var diff = end - new Date().getTime()
var h = Math.floor(diff / (60 * 1000 * 60))
var hdiff = diff % (60 * 1000 * 60)
var m = Math.floor(hdiff / (60 * 1000))
var mdiff = hdiff % (60 * 1000)
var s = mdiff / (1000)
var sCeil = Math.ceil(s)
var sFloor = Math.floor(s)
currentInterval = interval - offset // 得到下?次循環(huán)所消耗的時(shí)間
console.log('時(shí):' + h, '分:' + m, '毫秒:' + s, '秒向上取整:' + sCeil)
setTimeout(loop, currentInterval)
}
setTimeout(loop, currentInterval)
取自進(jìn)階17