Redux-saga с генераторами ES6 против redux-thunk и async/await
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
redux-thunk
с async/await
отлично подходит для решения простых асинхронных задач:
const fetchData = () => async dispatch => {
dispatch({ type: 'FETCH_START' });
try {
const data = await fetchAPI(); // "API, время работать!" 😆
dispatch({ type: 'FETCH_SUCCESS', data });
} catch (error) {
dispatch({ type: 'FETCH_FAIL', error });
}
};
Однако, если требуются сложные операции, такие как отмена запросов или управление задачами, следует выбирать redux-saga
:
function* fetchUserData() {
try {
yield put({ type: 'FETCH_START' }); // И так начинается наш FETCH_START ☀
const data = yield call(fetchAPI); // "Привет, fetchAPI, время показать, на что ты способен" 📞
yield put({ type: 'FETCH_SUCCESS', data });
} catch (error) {
yield put({ type: 'FETCH_FAIL', error }); // "Увы, произошла ошибка" 🚨
}
}
Прилегкой асинхронности используйте async/await
. Для управляемого контроля — yield
.
Особенности: redux-saga против redux-thunk
Выбор между redux-saga
и redux-thunk
зависит от особенностей вашего проекта и опыта команды, накопленного с этими технологиями. redux-saga
хорошо подходит для сложных сценариев, например, для реализации гонки условий или параллельных запросов. Этот подход предлагает логический способ работы с асинхронными потоками данных в стиле "Действие А влияет на результат В".
Redux-thunk прекрасно справляется с простыми случаями, где достаточно использовать async/await, и отлично подойдёт для небольших проектов, где побочные эффекты не играют значительной роли.
Тестирование и поддержка стали проще
Тестирование с помощью redux-saga — процесс несложный. Вы можете мокать данные в тестах, работая напрямую с объектами, не имитируя целые thunk-функции. Это стимулирует разработку по принципу TDD и повышает качество вашего кода.
С использованием yield
, можно писать код асинхронных процессов так, будто он синхронный, что упрощает его восприятие. Управление эффектами с помощью утилит из redux-saga становится интуитивно понятным.
Управление сложностью
По мере усложнения вашего приложения, redux-thunk
может начать теряться в запросах, в то время как redux-saga
поможет удержать чёткость ответственностей. Саги работают независимо, реагируют на действия в фоне и не привязаны напрямую к создателям действий, редьюсерам и UI.
Redux-Saga преуспевает в использовании event-channel для управления событиями, которые не связаны с Redux, такими как веб-сокеты или другие callback-события. Это эффективный и универсальный инструмент для управления побочными эффектами.
Преимущество в управлении продвинутыми потоками
С redux-saga вы можете реализовать сложные асинхронные потоки управления, такие как дебаунсинг или троттлинг, а также воплотить в жизнь задачи по запуску, остановке и отмене, которые сложно выполнить с использованием redux-thunk
.
Саги: Фоновые рабочие нити
Саги можно рассматривать как фоновые потоки вашего приложения, что работают, подобно тайным агентам, контролируя побочные эффекты за кулисами и обеспечивая их изоляцию от основной бизнес-логики. Взаимодействие с архитектурой react-redux делает redux-saga эффективным инструментом для управления состоянием.
Визуализация
Управление командой курьеров, которые осуществляют доставку сообщений, можно представить следующим образом:
| Механизм | Команда | Рабочий процесс |
| ----------------------- | ------------------ | ------------------------------------------------ |
| **redux-saga** | 🚴♂️ 🔄 Генератор | 📜 Внимательно и последовательно выполняет задачи. |
| **redux-thunk** | 🏃♂️ 💨 Async/Await | 💌 Быстро доставляет сообщения без остановок. |
С генераторами: Всё под контролем и вовремя.
🚴♂️ => 🛑 Получение задачи => 🔄 Её выполнение => 🛑 Остановка => 🔄 Выполнение следующего этапа
# Каждую стадию можно контролировать.
С Async/Await: Это непрерывный поток действий.
🏃♂️ => 💌 Быстрая доставка => 🏃♂️ => 💌 Следующий адрес
# Вроде бегунов-курьеров, которые не знают устали!
В любом случае, будь то ответственный велокурьер или стремительный бегун, каждая опция имеет свои преимущества и недостатки.
Адаптация к росту и сложности
С ростом и усложнением приложения, может оказаться необходимым переход на redux-saga, чтобы избежать утомительного рефакторинга.
Конкурентные процессы успешно контролируются с помощью redux-saga. От множества экземпляров саг до управления ситуациями гонки — redux-saga ориентирована на параллельные процессы.
Для больших проектов с систематизированным управлением побочными эффектами саги обеспечивают точное контролирование. Декларативный стиль и структурированность делают ваш код более чистым и удобным для поддержки.
Работа с обучающей кривой и опытом разработчика
Освоение работы с Redux-saga требует некоторых усилий, однако затраты оправдываются масштабируемым и мощным управлением состоянием. Начинающим разработчикам или небольшим проектам, скорее всего, будет удобнее использовать Redux-thunk за его простоту и удобство.
Полезные материалы
- Блог | Imaginary Cloud — конкретное сравнение Redux-Saga и Redux-Thunk.
- Medium: Понимание генераторов в ES6 JavaScript с Redux Saga — подробнее о генераторах ES6 с Redux Saga.
- Использование Redux Thunk в современных React проектах с функциональными компонентами — рекомендации по применению Redux Thunk в современных React-проектах.
- Понимание переменных, областей видимости и поднятия в JavaScript | DigitalOcean — разъяснение работы с переменными, областями видимости и поднятием в ES6+.
- Генераторы – JavaScript.info — подробный разбор генераторов на JavaScript и их использования.