2013-07-14 128 views
0

我有一個TimeOut不會停止,一旦清除使用它,我不確定爲什麼。無法清除TimeOut

這是我的函數:

function upgrade_bar(end, start, bar, timerId, func) {  

    var per = ((new Date().getTime()/1000) - start)/(end - start) * 100; 

    if(per>100)per=100; 
    if(per<0)per = 0; 

    if(per == 0) { 
     bar.style.width = per + "%"; 
    } else if(per == 100) { 
     clearTimeout(timerId); //this does not stop it 
     if(func !== false){ 
      func(); //this does call at 100% 
     } 
    } else{ 
     bar.style.width = per+ "%"; 
    } 
    console.log('still going'); 
    timerId = setTimeout(function() { upgrade_bar(end, start, bar, timerId, func) } , 17); 
} 

都誤解我這個是什麼?不是timerId保持超時的Id讓我清除它?

回答

2

setTimeout()只是時間表多一個函數的執行。

clearTimeout()可以用來阻止即將到來的超時達到時間前 - 但一旦達到超時和函數被調用,清除超時什麼都不做 - 它不打算反正再次運行。

這裏的問題是,不管你的函數發生了什麼,你最後再次調用setTimeout - 安排它再次運行。


一種可能的解決方案是重寫功能是這樣的:

function upgrade_bar(end, start, bar, func){  
    var per = ((new Date().getTime()/1000) - start)/(end - start) * 100; 
    if (per>100) per=100; 
    if (per<0) per = 0; 

    bar.style.width = per + "%"; 

    if (per == 100) { 
     if (func !== false) { 
      func(); //this does call at 100% 
     } 
    } else { 
     console.log('still going'); 
     setTimeout(function() { upgrade_bar(end, start, bar, func) } , 17); 
    } 
} 
+0

啊所以我很困惑它與SetInterval。確定一個簡單的'return false'應該結束它,而不是清除它? 也爲什麼clearTimeOut甚至存在,那麼它會有什麼用處。 – Sir

+0

@Dave我見過的一個地方clearTimeout用於自動完成。當一個鍵被按下時,你開始超時500毫秒,但如果用戶鍵入另一個字符,則取消它。這樣,它將不會實際執行,直到沒有輸入500毫秒。 –

+0

@Dave我已經更新了我的答案來解釋它。基本上,可以在達到時間之前調用clearTimeout來取消它。 – jcsanyi

0

setTimeout()導致指定的功能中的一個的執行。你在考慮setInterval(),它會一直執行直到取消。

在你的情況下,clearTimeout()被調用,但代碼繼續設置另一個超時,無論採取什麼代碼路徑。

嘗試撥打func()後再嘗試return,以避免再次設置超時。

+0

那麼clearTimeOut()實際上做什麼,我沒有看到在JS中的目的 – Sir