Перейти к основному содержимому

Утилиты для Redux-saga

Пакет предоставляет утилиты позволяющие работать с redux-saga более практично и удобно.

takeChain

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

подсказка
  • Эффект не останавливает весь тред в котором работает в ожидании завершения, так как запускается через fork!
  • Дубликаты экшенов также попадают в коллекцию
  • Если экшены не были собраны за заданное время (timeout), эффект будет также вызван, но в эффект будут переданы только экшены которые были собраны в коллекцию за это время.

Пример использования

import { takeChain } from '@sima-land/isomorph/utils/redux-saga';
import { call } from 'redux-saga/effects';
import { createAction } from '@reduxjs/toolkit';

function* exampleTakeChain() {
const actions = [createAction('action1'), createAction('action2')]
const options = 'example options';

yield takeChain(200, actions, exampleSaga, options);
yield put(actions[0]);
yield put(actions[1]);
}

function* exampleSaga(...params) {
yield call(console.log, params) // console.log('example options',[createAction('action1'), createAction('action2')])
}

createSagaMiddleware

предупреждение

Не рекомендуется к использованию, так как некорректно работает с redux-saga. Следует использовать оригинальный createSagaMiddleware из redux-saga.

Обёртка над оригинальным createSagaMiddleware из redux-saga, расширяет функционал методами timeout и run, примеры отображены ниже.

Пример использования на SSR

import { configureStore } from '@reduxjs/toolkit';
import { createSagaMiddleware } from '@sima-land/isomorph/utils/redux-saga';


function async initApp(logger) {
const onError = logger.error;
const sagaMiddleware = createSagaMiddleware({ onSagaError: logger.error });
const options = {};

...
const store = configureStore({
...
middleware: [sagaMiddleware],
});
/** Не более 500мс на выполнение саги rootSaga **/
await sagaMiddleware.timeout(500).run(rootSaga, options);
...

}

Пример использования на nonSSR

import { configureStore } from '@reduxjs/toolkit';
import { createSagaMiddleware } from '@sima-land/isomorph/utils/redux-saga';

function initApp(logger) {
const onError = logger.error;
const sagaMiddleware = createSagaMiddleware({ onSagaError: logger.error });
const options = {};

...
const store = configureStore({
...
middleware: [sagaMiddleware],
});
/** Вызываем сагу не ограничивая её во времени. **/
sagaMiddleware.run(rootSaga, options);
...

}