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