setTimeout重置后是否有两次触发setTimeout的风险?

问题描述 投票:0回答:1

有时我使用以下概念:

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)结束并且超时的回调执行
  6. [delay毫秒后,超时回调再次执行

这可能吗?如果有可能怎么预防呢?如果不可能,是什么阻止了它的发生?

javascript settimeout race-condition
1个回答
0
投票

不,这是不可能的。如果已经触发了内部超时,则clearTimeout将从事件队列中删除超时。它确保在您调用clearTimeout之后回调不会运行。

© www.soinside.com 2019 - 2024. All rights reserved.