@Worddoc
Frontend explorer

Redux-saga: как вызвать callback после исполнения множества Ajax запросов из разных саг?

Приветствую!

Стек: react, redux, redux-saga.
Проблема: есть прелоадер и куча ajax запросов, которые распределены по разным сагам. 1 запрос контролирует 1 сага. Как можно дождаться выполнения каждого из этих запросов и вызывать callback?
Цель: скрывать прелоадер только после успешного или неуспешного выполнения каждого запроса.

Очень надеюсь на помощь.
  • Вопрос задан
  • 1030 просмотров
Решения вопроса 2
GreyCrew
@GreyCrew
Full-stack developer
Решал аналогичную проблему.
Есть вариант.
Проблема в том, что запросы ассинхронные и мы не можем предугадать, какие из них выполнятся медленней, а какие быстрее.

Вариант для решения данной проблемы - создать пару эшнов, BEGIN_FETCHING и END_FETCHING.
Добавить в стор объект, который бы аккумулировал процесс загрузки, по умолчанию он равен 0.

В начале запроса делаем
yield put({
      type: BEGIN_FETCHING
    })

а в конце
yield put({
      type: END_FETCHING
    })


в редьюссере прописываем, что BEGIN_FETCHING увеличиваает значение, на 1, а END_FETCHING уменьшает
и когда у нас значение объекта стало 0, то убираем прелоадер.
Ответ написан
alexiusp
@alexiusp
senior frontend developer
ситуация хитрая, но решаемая. варианта два. если каждая из саг, осуществляющих ajax запрос, запускается по экшену, то она должна по завершении запроса пулять экшен. тогда в главной саге мы просто ждёт завершения всех саг, ожидая соответствующих экшенов. примерно так:
yield all([
  take(REQUEST_1_SUCCESS, REQUEST_1_FAIL),
  take(REQUEST_2_SUCCESS, REQUEST_2_FAIL),
  ...
])

Второй вариант делать то же но с форками, если саги лежат рядом и запускаются напрямую, без экшенов:
yield all([
  fork(request1Saga),
  fork(request2Saga),
  ...
])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 17:14
4000 руб./за проект
29 мар. 2024, в 17:04
5000 руб./за проект
29 мар. 2024, в 17:03
3000 руб./за проект