我有一箇中斷進入一個處理程序,我不想服務他們,直到自上次中斷5ms後,已經過去了,表明亂舞已經結束。setTimeout()是否自行重置?
我的想法是在每次輸入處理程序時都會調用setTimeout(LookAtInterrupts, 5)
,但在setTimeout()
文檔中我沒有看到它將取消掛起的預定呼叫,如果它在執行發生之前被調用。
事實上,它會做什麼?我不想在每個處理程序中斷後調用5ms,而只是最後一個。
我有一箇中斷進入一個處理程序,我不想服務他們,直到自上次中斷5ms後,已經過去了,表明亂舞已經結束。setTimeout()是否自行重置?
我的想法是在每次輸入處理程序時都會調用setTimeout(LookAtInterrupts, 5)
,但在setTimeout()
文檔中我沒有看到它將取消掛起的預定呼叫,如果它在執行發生之前被調用。
事實上,它會做什麼?我不想在每個處理程序中斷後調用5ms,而只是最後一個。
沒有手動復位超時,也不會 - 只要你想,你可以有很多掛起超時。
該函數返回一個鍵,您可以使用以後取消超時:
var key = setTimeout(...);
再到後來取消:
clearTimeout(key);
與一個已經過期的鍵調用clearTimeout()
不是錯誤,所以你不必擔心同步問題。
setTimeout
不會重置自身。
您可以通過
var timeout = setTimeout(...);
clearTimeout(timeout);
A setTimeout()
不會隱式取消任何以前的超時。
但是,您可以通過將標識符存儲在變量中並每次清除該變量來實現該目的。
var timeoutId = null;
var yourFn = function() {
clearTimeout(timeoutId);
timeoutId = setTimeout(fn, 5);
};
您需要存儲參考。 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,但我懷疑你實際上已經在接近這個位置(增加超時的花費)。
店參考的變量setTimeout調用,並且之後的每個全成中斷,造成超時之前,取消以前的超時,
var tv = null;
function interrupt(){
if(tv !== null){
clearTimeout(tv);
}
tv = setTimeout(LookAtInterrupts,5)
}
function LookAtInterrupts(){
}
通過這種方式,可以保證,只有最後中斷將繼續以5ms間隔執行。我希望這一點很明確。
雖然你可以自己實現這一點,但更實際的解決方案是抓住下劃線。js並使用它的去抖功能(請參閱http://underscorejs.org/#debounce)。
然後,你可以這樣做:
var lookAtInterrupts = _.debounce(handleInterrupt, 5);
所得到的函數將只運行最多一次,每5毫秒。
當執行setTimeout()
時,它會安排一個呼叫到您綁定的function()
。
如果你想取消它,你必須得到ID,由setTimeout()
返回,並明確爲:
var timeOutID = setTimeout(LookAtInterrupts, 5);
(...)
clearTimeOut(timeOutID);