1 of 27

Redux-saga

otus.ru

2 of 27

Проверить, идет ли запись

Меня хорошо видно

&& слышно?

Ставим “+”, если все хорошо

“-”, если есть проблемы

3 of 27

Redux saga

Тема вебинара

Шепелев Максим

Главный разработчик

5 лет опыта фронтенд разработчиком, занимая разные должности от middle до tech-lead

Работаю в компании metacommerce

4 of 27

Redux-saga

5 of 27

Redux-saga

redux-sagaэто библиотека, которая призвана упростить и улучшить управление побочными эффектами в приложениях на Redux. Это middleware, которое реагирует на экшены после их обработки редюсерами. Саги могут запускаться, останавливаться и отменяться из основного приложения с помощью обычных действий Redux.

Чтобы начать работу с redux-saga необходимо:�

  • Установить пакет redux-saga

npm install redux-saga

yarn add redux-saga

  • Создать worker, watcher и saga
  • Подключить саги к Redux Store

6 of 27

Подключение

7 of 27

Начало работы

Сага - обычная функция-генератор со знаком *. В данном случае всё, что она делает - это выводит приветственное сообщение в консоль.

//sagas.js

Для запуска нашей Саги нужно:

  • создать промежуточный слой (Saga middleware) со списком всех саг, которые нужно запустить (пока что есть только helloSaga)
  • подключить этот промежуточный слой к хранилищу Redux (Redux store)

8 of 27

Начало работы

9 of 27

watcher

10 of 27

Watcher

Watcher Saga — это сага, которая следит за определенными действиями (actions) Redux и решает, что делать, когда такое действие происходит. Обычно watcher саги не выполняют никаких действий напрямую, они лишь отслеживают возникновение определенных действий и запускают соответствующие worker саги.

11 of 27

worker

12 of 27

Worker

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

13 of 27

effects

14 of 27

Effects

В Redux Saga, эффекты используются для выполнения различных задач, таких как вызов асинхронных функций, запуск других саг, ожидание действий и многое другое. Эффекты создаются с помощью специальных вспомогательных функций, и каждый из них имеет свою специфику. Вот основные виды эффектов:

  • take
  • takeEvery
  • takeLatest
  • takeLeading
  • call
  • fork
  • put
  • select
  • cancel
  • race
  • all
  • delay

15 of 27

take

takeEvery

Приостанавливает выполнение саги и прослушивает выполняемые actions до тех пор, пока action, соответствующий pattern, не будет задиспатчен. После этого возобновляет выполнение саги. Является блокирующей.

Прослушивает все действия указанного типа и запускает сагу каждый раз, когда действие происходит. Это один из наиболее часто используемых эффектов.

16 of 27

takeLatest

takeLeading

Похож на takeEvery, но автоматически отменяет предыдущую сагу, если она все еще выполняется в момент получения нового действия того же типа.

Прослушивает действия указанного типа, но игнорирует все последующие действия, пока текущая сага не завершится.

17 of 27

call

fork

Функция вызова других функций (fetchData) с аргументами (apiEndpoint). В качестве fn могут быть как синхронные, так и асинхронные, возвращающие Promise, а также являющиеся функцией-генератором. Call является блокирующей функцией, т.е. она приостанавливает сагу до своего завершения.

так же как и call является функцией вызова функции, но с тем отличием, что она не является блокирующей. Т.е. после запуска fork(...) сразу выполняется следующая строка кода, а не дожидается результата её выполнения.

18 of 27

all

race

Позволяет одновременно запустить несколько саг или эффектов и ждать их завершения

Позволяет сагам участвовать в гонке, где только первая завершенная сага влияет на дальнейшее выполнение.

19 of 27

put

select

Функция отправки action, её можно воспринимать как dispatch(action). Является блокирующей.

Функция получения актуального значения из state. Selector — функция, которая принимает актуальный state, а возвращает нужную его часть. Вызов select без аргументов (yield select()) можно воспринимать как store.getState().

20 of 27

cancel

delay

Отменяет выполнение запущенной саги.

Позволяет саге ждать заданное количество миллисекунд. Полезно для ситуаций, когда требуется задержка.

21 of 27

Обработка ошибок

22 of 27

Обработка ошибок

Если родительская сага не содержит обработчика ошибок и вызывает дочерние саги через fork, то в случае ошибки в одной из них ошибка всплывет до родительской саги, что вызовет ее падение. В таком случае лучше использовать эффект spawn. Он позволит даже в случае падения одной из дочерних саг все равно выполнить остальные

23 of 27

Вопросы?

Ставим “+”,

если вопросы есть

Ставим “–”,

если вопросов нет

24 of 27

Полезные материалы

25 of 27

Полезные материалы

  1. Статья: "Understanding Side Effects in Redux-Saga"
  2. Статья: "Redux Thunk vs Redux Saga: Managing Side Effects in React.js Projects"
  3. Статья: "The power of Redux-Saga

26 of 27

Рефлексия

27 of 27

Заполните пожалуйста опрос о занятии по ссылке в чате