gpt4 book ai didi

javascript - 在我 "reset"之后 setTimeout 会触发两次吗?

转载 作者:行者123 更新时间:2023-11-30 13:51:23 25 4
gpt4 key购买 nike

有时我会使用以下概念:

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 ms后,timeout的回调再次执行

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

最佳答案

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

In the spec ,有一个事件计时器列表,定时事件循环任务从中获取要执行的回调,并且clearTimeout清除该列表中的计时器,因此即使任务已经被安排,它仍然会在执行回调之前检查计时器是否仍然处于事件状态。

关于javascript - 在我 "reset"之后 setTimeout 会触发两次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58156617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com