Toggle Favorite, лайк, чекбокс должны срабатывать мгновенно. Ждать ответа сервера — медленно. Сразу применяем изменение к UI (optimistic), параллельно отправляем на сервер. Если сервер отклонил — откатываем (rollback).
Какую проблему решаем
Между optimistic apply и server response может пройти полсекунды, и пользователь успеет тогглить ещё несколько штук. Если просто хранить «предыдущее состояние» в переменной — конкурирующие toggles сломают логику отката.
Операторы и зачем они нужны
Subject — принимает UI-команды (toggle a, toggle b).
mergeMap — независимые мутации разных сущностей идут параллельно. Toggle a не блокирует toggle b.
catchError — server error превращается в rollback-событие, а не падение всего потока.
scan — reducer применяет последовательность optimistic/confirm/rollback событий к состоянию.
Подводные камни
switchMap — toggle b отменит уже летящий save для toggle a. Половина изменений потеряется.
concatMap — каждый toggle ждёт окончания предыдущего. Optimistic feedback больше не «мгновенный».
Rollback должен знать ОБРАТНОЕ значение (или предыдущее). Иначе при двух подряд тогглах одной сущности откат вернёт не то.
Что в итоге получаем
UI ощущается мгновенным, но при отказе сервера состояние корректно откатывается. Пользователь видит правду.