Изменение времени задержки при тайм-ауте во время его работы - PullRequest
1 голос
/ 05 апреля 2020

Я хотел бы изменить или обновить время задержки по тайм-ауту во время его работы. Я подтвердил, используя debounceTime () в качестве альтернативы. Но нужно найти способ обновить уже упоминавшуюся задержку времени. Вместо создания новой.

В приведенном выше фрагменте кода я упомянул задержку как 10 se c. Но мне нужно после того, как этот settimeout запущен, когда вызывается событие мыши, мне нужно обновить время задержки, пока settimeout работает.

Пожалуйста, сообщите. Спасибо

1 Ответ

1 голос
/ 05 апреля 2020

Вы можете создать Timer class, чтобы помочь. Пожалуйста, смотрите ниже implementation. Timer.start чтобы запустить таймер. если вы хотите изменить некоторые данные и re-run. Затем используйте Timer.interrupt. Он возьмет дельту и снова запустит функцию. Вы можете изменить свою логику c.

class Timer {
  constructor(cb, ms = 2000) {
    this._ms = ms;
    this.ms = ms;
    this.cb = cb;
    this.timer = null;
    this.startedAt = null;
  }
  start() {
    this.startedAt = new Date().getTime();
    clearTimeout(this.timer);
    console.log("started");
    this.timer = setTimeout(() => {
      this.cb();
    }, this._ms);
  }
  intrupt() {
    const timeSpends = new Date().getTime() - this.startedAt;
    const timeLeft = this.ms - timeSpends;
    if (timeLeft > 0) {
      this._ms = timeLeft;
      this.start();
    }
  }
}
console.time("TIME");
let counter = 0;
const timer = new Timer(() => {
  console.timeEnd("TIME");
  console.log("counter: ", counter);
});

timer.start();
setTimeout(function cancel() {
  counter++;
  timer.intrupt();
}, 1000);
...