Ответ вслух Senior Архитектура состояния обновлено

Оптимистичные обновления и откат

Вопрос

Как спроектировать оптимистичные обновления? Какие подводные камни?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Оптимистичное обновление применяю там, где почти всегда успех и действие легко отменить: лайк, отметка задачи, переименование. Схема в TanStack Query такая: в onMutate отменяю текущие запросы по ключу через cancelQueries, чтобы они не перетёрли значение, сохраняю снимок и подставляю новое значение.

Что должно прозвучать в ответе

  • Подходит для действий с высокой вероятностью успеха

  • Снимок предыдущего состояния, мгновенное применение, откат при ошибке

  • Отмена исходящих запросов по тому же ключу, чтобы они не перетёрли оптимистичное значение

  • Инвалидация или сверка с ответом сервера после завершения

  • Гонки при быстрых повторных действиях: последовательность или идемпотентность

  • Понятное сообщение пользователю при откате

Что могут спросить следом

  • Где оптимистичное обновление нельзя применять?
  • Как это сделать в React 19?

Разбор

Оптимистичное обновление применяю там, где почти всегда успех и действие легко отменить: лайк, отметка задачи, переименование. Схема в TanStack Query такая: в onMutate отменяю текущие запросы по ключу через cancelQueries, чтобы они не перетёрли значение, сохраняю снимок и подставляю новое значение. В onError откатываю снимок и показываю тост. В onSettled инвалидирую ключ, чтобы сверить с сервером. Подводный камень: быстрые повторные клики, лайк и снятие лайка, тут нужна идемпотентность на сервере или очередь. В React 19 есть useOptimistic, который показывает временное значение, пока идёт действие. Для оплаты и необратимых операций оптимизм не применяю.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.