В шапке Wildberries счётчик корзины, на странице товара — кнопка «В корзину», в подвале — выбранный пункт выдачи. Все читают один стор. Если перерисовывать всех на любое изменение, смена ПВЗ дёргает счётчик корзины, и на слабом телефоне это заметно.
Напишите createStore(initial) → { getState, setState, subscribe }. setState(patch) принимает объект или функцию state => patch и делает новое состояние { ...state, ...patch } — старый объект не меняется.
subscribe(selector, listener) возвращает функцию отписки. После каждого setState для каждой подписки считается selector(state); если значение отличается по Object.is от прошлого, вызывается listener(next, prev). Прошлое значение для новой подписки — результат селектора в момент подписки.
Оповещение синхронное, по порядку подписки. Отписка срабатывает сразу: отписанный в этом же оповещении слушатель уже не вызывается, а остальные — вызываются. Подписка, сделанная во время оповещения, начинает работать со следующего setState.
В работе: Свой стор без Redux, useSyncExternalStore в React, общие данные между виджетами.
Пример 1: изменилось — оповестили
[["sub", "badge", "count"], ["set", {"cartCount": 2}]]["badge(2,0)"]
Пример 2: чужое поле — тишина
[["sub", "badge", "count"], ["set", {"city": "Казань"}]][]
createStore — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 10: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function createStore(initial) // → { getState(), setState(patchOrFn), subscribe(selector, listener) → unsubscribe }
Источник: на задачах Wildberries: корзина и выбор пункта выдачи. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.