Как работает Redux Saga
Что проверяют
Понимаете ли вы модель эффектов и генераторов, а не только умеете копировать takeEvery. Следом почти всегда спрашивают разницу между takeEvery и takeLatest, между fork и spawn, и почему в новых проектах берут RTK Query или listener middleware.
Как отвечать
Redux Saga это middleware для Redux, который выносит побочные эффекты в функции-генераторы. Подключается через createSagaMiddleware(), после создания стора вызывается sagaMiddleware.run(rootSaga). Экшен сначала проходит редьюсеры, и только потом его видят саги.
Ключевая идея: сага не выполняет эффекты сама, а выдаёт через yield простые объекты-описания. call(api.fetchUser, id) возвращает объект вида «вызови эту функцию с этими аргументами», middleware исполняет его, если результат промис, дожидается и возвращает значение в генератор через next(). Поэтому сагу легко тестировать: шагаете по генератору и сравниваете выданные эффекты с ожидаемыми, сеть не нужна.
Основные эффекты:
call,put,select: вызвать функцию, отправить экшен, прочитать стор;take: ждать конкретный экшен, так пишутся пошаговые сценарии вроде «логин, работа, логаут»;takeEvery,takeLatest,takeLeading: запускать обработчик на каждый экшен, только на последний с отменой предыдущего или только на первый до его завершения;forkиspawn: неблокирующий запуск. Задача отforkпривязана к родителю, и её ошибка роняет родителя,spawnсоздаёт независимую;race,all,cancel,delay: гонка, параллельный запуск, отмена, пауза;eventChannel: превращает WebSocket или другой источник событий в поток для саги.
Где спотыкаются
Не ставят try/catch в обработчиках. Необработанная ошибка в одной саге поднимается до rootSaga и убивает остальные, приложение молча перестаёт реагировать.
Думают, что takeLatest отменяет сетевой запрос. Отменяется сага, а fetch идёт дальше, пока вы не прервёте его через AbortController в блоке finally с проверкой cancelled().
Берут сагу для обычной загрузки данных. Для этого в Redux Toolkit есть RTK Query с кэшем и инвалидацией, а сага окупается на сложных сценариях: очереди, отмены, долгие процессы.