有时我使用以下概念:
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)
结束并且超时的回调执行delay
毫秒后,超时的回调再次执行这可能吗?如果有可能怎么预防呢?如果不可能,是什么阻止了它的发生?
答案 0 :(得分:2)
否,这是不可能的。如果内部超时已经触发,clearTimeout
将从事件队列中删除超时。这样可以确保在调用clearTimeout
之后,回调不会运行。
In the spec,有一个活动计时器的列表,定时事件循环任务从中获取要执行的回调,而clearTimeout
清除计时器列出,因此即使已安排任务,它仍将在执行回调之前检查计时器是否仍处于活动状态。