Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Redux: saga, генератор, функция, state, api

Как вы используете redux-saga для работы с асинхронными действиями?

Этот вопрос проверяет знание redux-saga как инструмента для работы с асинхронным кодом в Redux.

Короткий ответ

redux-saga — это middleware для Redux, которое использует генераторы JavaScript для управления асинхронными действиями. Вместо отправки функций, как в redux-thunk, вы описываете эффекты в "сагах", которые следят за действиями и выполняют побочные эффекты (например, запросы к API). Это делает асинхронный код более структурированным и предсказуемым.

Длинный ответ

redux-saga помогает обрабатывать побочные эффекты, такие как запросы к API, задержки или взаимодействия с внешними ресурсами, без переполнения логики в компонентах или редьюсерах. Она базируется на концепции "саг" — генераторных функций, которые реагируют на действия Redux и выполняют эффекты.

Установка:

npm install redux-saga

Создание редьюсера:

const initialState = { data: null, loading: false, error: null };
const reducer = (state = initialState, action) => {
	switch (action.type) {
		case 'FETCH_START':
			return { ...state, loading: true, error: null };
		case 'FETCH_SUCCESS':
			return { ...state, loading: false, data: action.payload };
		case 'FETCH_ERROR':
			return { ...state, loading: false, error: action.error };
		default:
			return state;
	}
};

Создание саги: Сага — это генераторная функция, которая следит за действиями и выполняет эффекты:

import { call, put, takeEvery } from 'redux-saga/effects';
function* fetchDataSaga() {
	try {
		yield put({ type: 'FETCH_START' }); // Уведомляем о начале загрузки
		const data = yield call(() => fetch('https://api.example.com/data').then(res => res.json()));
		yield put({ type: 'FETCH_SUCCESS', payload: data }); // Успешный результат
	} catch (error) {
		yield put({ type: 'FETCH_ERROR', error }); // Обработка ошибки
	}
}
// Следим за определенными действиями
function* watchFetchData() {
	yield takeEvery('FETCH_DATA', fetchDataSaga);
}

Подключение саги к хранилищу:

import createSagaMiddleware from 'redux-saga';
import { createStore, applyMiddleware } from 'redux';
import { all } from 'redux-saga/effects';
const sagaMiddleware = createSagaMiddleware();
// Корневая сага
function* rootSaga() {
	yield all([watchFetchData()]); // Запуск всех "наблюдателей"
}
const store = createStore(reducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(rootSaga); // Запуск саг

Отправка действий:

store.dispatch({ type: 'FETCH_DATA' });

Преимущества redux-saga:

  • Удобная организация сложных асинхронных операций.

  • Возможность тестирования генераторов.

  • Поддержка контроля потоков (например, takeLatest, чтобы выполнять только последнее действие).

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Redux

    Redux

Ключевые слова

#saga

#генератор

#функция

#state

#api

Подпишись на React Developer в телеграм