Как связать логику при множестве экшенов и запросов в frontend
Что проверяют
Есть ли у вас система, по которой логика раскладывается по слоям, или всё живёт в useEffect и глобальном сторе. Следом обычно дают сценарий: пользователь быстро меняет фильтры, запросы возвращаются в другом порядке, что покажет экран.
Как отвечать
Начните с разделения состояния на два вида:
- серверное: данные с бэкенда. Их лучше отдать TanStack Query или RTK Query: кэш по ключу, дедупликация одинаковых запросов, повторы, инвалидация после мутаций через
invalidateQueriesили теги. Зависимые запросы строятся черезenabled, а не цепочкой эффектов; - клиентское: открытые панели, черновик формы, выбранные элементы. Это Redux Toolkit, Zustand или локальный стейт компонента.
Дальше оркестрация. Простую последовательность пишут в обработчике события или в thunk, configureStore в RTK подключает thunk по умолчанию. Реакцию на экшены («после оплаты обнови корзину и покажи уведомление») удобно вынести в createListenerMiddleware. Redux Saga оправдана, когда много отмен, гонок и таймаутов, а многошаговые процессы вроде мастера оформления читаемее описывать конечным автоматом, например на XState.
Про гонки скажите отдельно: предыдущий запрос отменяется через AbortController, устаревший ответ отбрасывается, для параллельной загрузки есть Promise.all и Promise.allSettled, если частичный успех допустим. Статус запроса храните одним полем idle | loading | success | error, а не тремя булевыми флагами. Производные данные считаются селекторами, а не копируются в стор.
Логику фичи держите рядом с ней: кастомный хук или слайс на фичу, компонент только вызывает и рисует.
Где спотыкаются
Складывают ответы API в Redux и вручную пишут isLoading, error и кэш. Получается самописный TanStack Query с багами.
Пишут fetch в useEffect без отмены. При быстрой смене параметров старый ответ перезаписывает новый.
Строят цепочки эффектов, где один эффект меняет состояние, а другой на это реагирует. Это лишние рендеры и зависимости, которые никто не видит. Действие, вызванное кликом, выполняется в обработчике клика.