Вопрос проверяет понимание middleware в Redux и подходов к работе с побочными эффектами.
Thunk — это простой middleware, который позволяет писать асинхронную логику прямо в экшенах. Saga — это отдельный слой логики на основе генераторов, который управляет сайд-эффектами декларативно. Thunk проще в освоении, но хуже масштабируется. Saga сложнее, зато лучше подходит для сложных сценариев и бизнес-логики.
Redux сам по себе синхронный, поэтому для асинхронной логики используются middleware.
Thunk позволяет экшену быть функцией.
const fetchData = () => (dispatch) => {
dispatch(start());
fetch(url)
.then(r => r.json())
.then(data => dispatch(success(data)));
};
Характеристики:
Минимальный порог входа
Логика и экшены смешаны
Хорош для простых запросов
Сложно тестировать сложные сценарии
Saga использует генераторы для описания эффектов.
function* fetchDataSaga() {
try {
const data = yield call(api.fetch);
yield put(success(data));
} catch (e) {
yield put(error(e));
}
}
Характеристики:
Чёткое разделение логики и экшенов
Декларативное описание эффектов
Удобна для сложных сценариев
Хорошо тестируется
Более высокий порог входа
Thunk — imperative
Saga — declarative
Thunk — проще читать новичкам
Saga — лучше масштабируется
Thunk — быстрый и простой выбор для небольших проектов. Saga оправдана, когда логика сложная, асинхронная и требует строгого контроля.