Войти Регистрация
Фронтенд

64. Шина статусов заказа Яндекс Еды с масками order.*

Средняя

В веб-версии Яндекс Еды статус заказа приходит событиями: 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 }
EventEmitterпаттерн наблюдательмаски событий

Источник: на задачах Яндекс Еды: статусы заказа в веб-версии. Условие пересказано своими словами.