有时我使用以下概念:
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
毫秒后,超时回调再次执行这可能吗?如果有可能怎么预防呢?如果不可能,是什么阻止了它的发生?
不,这是不可能的。如果已经触发了内部超时,则clearTimeout
将从事件队列中删除超时。它确保在您调用clearTimeout
之后回调不会运行。