2013-10-02 77 views
1

我有一箇中斷進入一個處理程序,我不想服務他們,直到自上次中斷5ms後,已經過去了,表明亂舞已經結束。setTimeout()是否自行重置?

我的想法是在每次輸入處理程序時都會調用setTimeout(LookAtInterrupts, 5),但在setTimeout()文檔中我沒有看到它將取消掛起的預定呼叫,如果它在執行發生之前被調用。

事實上,它會做什麼?我不想在每個處理程序中斷後調用5ms,而只是最後一個。

回答

9

沒有手動復位超時,也不會 - 只要你想,你可以有很多掛起超時。

該函數返回一個鍵,您可以使用以後取消超時:

var key = setTimeout(...); 

再到後來取消:

clearTimeout(key); 

與一個已經過期的鍵調用clearTimeout()不是錯誤,所以你不必擔心同步問題。

2

setTimeout不會重置自身。

您可以通過

var timeout = setTimeout(...); 
clearTimeout(timeout); 
1

A setTimeout()不會隱式取消任何以前的超時。

但是,您可以通過將標識符存儲在變量中並每次清除該變量來實現該目的。

var timeoutId = null; 
var yourFn = function() { 
    clearTimeout(timeoutId); 
    timeoutId = setTimeout(fn, 5); 
}; 
1

您需要存儲參考。 setTimeout結果可以稍後存儲和清除。

對於 「復位」 setTimeout

// first assign it 
var timeout = setTimeout(function(){ 
    foo(); 
}, 50); 

// then look for an existing assignment before re-assinging 
if (timeout) clearTimeout(timeout); 
timeout = setTimeout(function(){ 
    bar(); 
}, 50); 

參考文獻:

順便說一句,be careful設置超時< 5ms的時。雖然HTML5應該支持4,但我懷疑你實際上已經在接近這個位置(增加超時的花費)。

0

店參考的變量setTimeout調用,並且之後的每個全成中斷,造成超時之前,取消以前的超時,

var tv = null; 

function interrupt(){ 
    if(tv !== null){ 
     clearTimeout(tv); 
    } 
    tv = setTimeout(LookAtInterrupts,5) 
} 

function LookAtInterrupts(){ 

} 

通過這種方式,可以保證,只有最後中斷將繼續以5ms間隔執行。我希望這一點很明確。

0

雖然你可以自己實現這一點,但更實際的解決方案是抓住下劃線。js並使用它的去抖功能(請參閱http://underscorejs.org/#debounce)。

然後,你可以這樣做:

var lookAtInterrupts = _.debounce(handleInterrupt, 5); 

所得到的函數將只運行最多一次,每5毫秒。

0

當執行setTimeout()時,它會安排一個呼叫到您綁定的function()

如果你想取消它,你必須得到ID,由setTimeout()返回,並明確爲:

var timeOutID = setTimeout(LookAtInterrupts, 5); 
(...) 
clearTimeOut(timeOutID);