Код Middle Архитектура и новая архитектура обновлено

Подписки на события: эмиттер с remove()

Условие

Нативные модули отдают события через эмиттер: addListener возвращает подписку с методом remove(). Реализуйте упрощённую версию для проверки логики.

Функция runEmitter(ops) получает список операций и возвращает массив строк, которые «получили» слушатели:

  • ["add", name, event]: подписать слушателя name на событие event (подписки получают номера по порядку с 0);
  • ["remove", subIndex]: снять подписку с этим номером (повторное снятие ничего не делает);
  • ["emit", event, payload]: каждый активный слушатель события в порядке подписки записывает "<name>:<payload>".

Один и тот же слушатель может быть подписан дважды, тогда получит событие дважды.

Примеры

runEmitter([["add", "a", "battery"], ["emit", "battery", 50]]) // ["a:50"]
runEmitter([["add", "a", "battery"], ["add", "b", "battery"], ["emit", "battery", 40]]) // ["a:40", "b:40"]
runEmitter([["add", "a", "battery"], ["add", "b", "net"], ["emit", "net", "wifi"]]) // ["b:wifi"]

Как подойти

Подсказки: 2
  1. Храните каждую подписку отдельным объектом с флагом активности.
  2. Снятие по номеру подписки, а не по имени слушателя.

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

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