Иногда я использую следующую концепцию:
class ResetableTimeout extends EventEmitter {
constructor() {
this.id = -1;
}
start(delay) {
clearTimeout(this.id);
this.id = setTimeout(() =>{this.emit("done");}, delay);
}
}
Подобную архитектуру можно использовать, например, для операций дросселирования.
Теперь я заметил, что при таких обстоятельствах это может срабатывать дважды:
setTimeout
запускается тайм-аут start(delay)
вызывается и выполняет - Тайм-аут срабатывает и обратный вызов выдвигается в EventLop, ожидая
start(delay)
дляend clearTimeout
вызывается, но время ожидания уже выполнено start(delay)
заканчивается и обратный вызов времени ожидания выполняется delay
мс позже, обратный вызов времени ожидания выполняется снова
Возможно ли это? Если это возможно, как это предотвратить? Если это невозможно, что мешает этому случиться?