BACK
Use casesOptimistic update — откат при ошибке
Use cases · 33

Optimistic update — откат при ошибке

Паттерн

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 ощущается мгновенным, но при отказе сервера состояние корректно откатывается. Пользователь видит правду.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...