[英]Why do I need to call clearTimeout twice to reset setTimeout
[英]Is there a risk that setTimeout will fire twice after I “reset” it?
有時我使用以下概念:
class ResetableTimeout extends EventEmitter {
constructor() {
this.id = -1;
}
start(delay) {
clearTimeout(this.id);
this.id = setTimeout(() =>{this.emit("done");}, delay);
}
}
例如,這樣的架構可用於限制操作。
現在我注意到在這些情況下這可能會觸發兩次:
setTimeout
開始超時start(delay)
被調用並正在執行start(delay)
結束clearTimeout
被調用,但超時已經完成start(delay)
結束並執行 timeout 的回調delay
毫秒后,超時的回調再次執行這可能嗎? 如果有可能如何預防? 如果不可能,是什么阻止它發生?
不,這是不可能的。 如果內部超時已經觸發,則clearTimeout
將從事件隊列中刪除超時。 它確保在您調用clearTimeout
后回調不會運行。
在規范中,有一個活動計時器列表,定時事件循環任務從中獲取要執行的回調,並且clearTimeout
清除該列表中的計時器,因此即使已經安排了任務,它仍然會檢查是否在執行回調之前計時器仍然處於活動狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.