簡體   English   中英

在我“重置”它之后,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);
  }
}

例如,這樣的架構可用於限制操作。

現在我注意到在這些情況下這可能會觸發兩次:

  1. setTimeout開始超時
  2. start(delay)被調用並正在執行
  3. 超時觸發並在事件循環中推送回調,等待start(delay)結束
  4. clearTimeout被調用,但超時已經完成
  5. start(delay)結束並執行 timeout 的回調
  6. delay毫秒后,超時的回調再次執行

這可能嗎? 如果有可能如何預防? 如果不可能,是什么阻止它發生?

不,這是不可能的。 如果內部超時已經觸發,則clearTimeout將從事件隊列中刪除超時。 它確保在您調用clearTimeout后回調不會運行。

在規范中,有一個活動計時器列表,定時事件循環任務從中獲取要執行的回調,並且clearTimeout清除該列表中的計時器,因此即使已經安排了任務,它仍然會檢查是否在執行回調之前計時器仍然處於活動狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM