關(guān)于定時(shí)器多次啟動(dòng)/關(guān)閉問(wèn)題
為什么
setTimeout連續(xù)多次觸發(fā)之后,多次clearTimeout可以停止
setInterval連續(xù)多次之后,多次clearInterval停止不了
?
<input type = "button" value = "Start" onclick="startCount">
<input type = "button" value = "Stop" onclick="stopCount">
2025-01-21
如果代碼你沒(méi)有進(jìn)行更改的話,原代碼里i存儲(chǔ)的timeout的id只有最后一個(gè)觸發(fā)start函數(shù)的計(jì)時(shí)器,而其他任務(wù)都以異步調(diào)用的形式等待執(zhí)行,當(dāng)他們?cè)僖淮斡|發(fā)回調(diào)函數(shù)的時(shí)候,i值就又存儲(chǔ)上計(jì)時(shí)器id了,所以會(huì)有多次點(diǎn)擊stop可以逐個(gè)取消掉的效果;
而setInterval的id只有調(diào)用該函數(shù)的時(shí)候才會(huì)喚起一次,而不是遞歸地調(diào)用setTimeout一樣“實(shí)時(shí)更新”變量i中存儲(chǔ)的id值。因此多次觸發(fā)setInterval函數(shù)后,變量i僅能存儲(chǔ)最后一次調(diào)用的setInterval函數(shù)的計(jì)時(shí)器id,無(wú)法再得知此前啟動(dòng)的計(jì)時(shí)器id了,也就自然沒(méi)法通過(guò)clearInterval來(lái)取消掉。
如果想要保證每次啟動(dòng)計(jì)時(shí)器的id都能被有效地存儲(chǔ)下來(lái),可以考慮使用數(shù)組來(lái)存儲(chǔ)。