Код Middle Асинхронные паттерны спрашивают часто обновлено

Свой EventEmitter: on, off, once, emit

Условие

Реализуй класс Emitter в духе node:events:

  • on(event, fn) подписывает, возвращает this;
  • once(event, fn) подписывает на одно срабатывание;
  • off(event, fn) отписывает (в том числе подписку через once по исходной функции);
  • emit(event, ...args) синхронно вызывает слушателей в порядке подписки, возвращает true, если слушатели были;
  • listenerCount(event).

Как в Node: emit('error', err) без слушателей error бросает err. Отписка во время emit не должна ломать текущий обход.

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

  • on и emit с аргументами

  • emit без слушателей возвращает false

  • порядок подписки и чейнинг

  • once срабатывает один раз

  • off по исходной функции once

  • отписка во время emit не ломает обход

  • error без слушателя бросает

  • error со слушателем не бросает

  • listenerCount

Как подойти

Подсказки: 3
  1. Храни слушателей в Map<event, массив>.
  2. Для once храни обёртку и исходную функцию, чтобы off(fn) нашёл подписку.
  3. В emit обходи копию массива.

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

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

Термины по теме