В веб-версии Яндекс Еды статус заказа приходит событиями: order.accepted, order.courier.assigned, order.courier.arrived, order.delivered. Шапке нужен любой статус, карте — только события курьера, чеку — только order.delivered.
Напишите класс Bus. on(pattern, fn) подписывает и возвращает функцию отписки. once(pattern, fn) срабатывает один раз. off(pattern, fn) снимает подписку с этой парой — и обычную, и once.
Маска делится на сегменты по точке. * — ровно один любой сегмент. ** — только последним сегментом, один и больше любых сегментов. Остальные сегменты сравниваются точно. order.* ловит order.accepted, но не order.courier.assigned; order.** ловит оба, но не order.
emit(event, payload) вызывает подходящие обработчики с payload в порядке подписки и возвращает их число. Подписки, добавленные или снятые во время emit, влияют только на следующие emit.
В работе: Карта подписана на order.courier.*, шапка — на order.**: событие arrived должно попасть в оба места один раз.
Пример 1: маски одного и многих сегментов
[["on", "header", "order.**"], ["on", "map", "order.courier.*"], ["on", "receipt", "order.delivered"], ["emit", "order.courier.arrived"], ["emit", "order.delivered"], ["emit", "order"]]
["header:arrived", "map:arrived", "=2", "header:delivered", "receipt:delivered", "=2", "=0"]
Пример 2: звёздочка — ровно один сегмент
[["on", "s", "order.*"], ["emit", "order.accepted"], ["emit", "order.courier.assigned"]]
["s:accepted", "=1", "=0"]
Bus — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 9: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
class Bus { on(pattern, fn) → unsubscribe; once(pattern, fn) → unsubscribe; off(pattern, fn); emit(event, payload) → number }
Источник: на задачах Яндекс Еды: статусы заказа в веб-версии. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.