Код Middle Реализация с нуля обновлено

debounce + cancel + flush

Условие

Доработай debounce: добавь методы cancel() (отменить отложенный вызов) и flush() (вызвать немедленно, если есть отложенный).

Что проверяют тесты

  • схлопывает вызовы

  • cancel отменяет

  • flush вызывает сразу

  • flush без отложенного - ничего

  • this сохранён

Как подойти

Замыкание хранит timer, lastArgs, lastThis. wrapper - обычная function (нужен this), cancel/flush вешаются на неё как свойства. Инвариант: timer !== null означает «есть отложенный вызов»; сбрасывай его и в колбэке, и в cancel.

Подсказки: 3
  1. Методы вешаются на саму возвращаемую функцию - она объект.
  2. Чтобы flush мог вызвать fn, нужно хранить последние args и this.
  3. После срабатывания и после cancel обнуляй timer, иначе flush выстрелит повторно.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.