getState в редукс-саге?

У меня есть магазин со списком предметов. Когда мое приложение сначала загружается, мне нужно десериализовать элементы, как в создании некоторых объектов в памяти на основе элементов. Элементы хранятся в моем магазине itemsReducer и обрабатываются itemsReducer.

Я пытаюсь использовать саунд-сагу для обработки десериализации, как побочный эффект. При загрузке первой страницы я отправляю действие:

dispatch( deserializeItems() );

Моя сага настроена просто:

function* deserialize( action ) {
    // How to getState here??
    yield put({ type: 'DESERISLIZE_COMPLETE' });
}

function* mySaga() {
    yield* takeEvery( 'DESERIALIZE', deserialize );
}

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

Ответ 1

вы можете использовать эффект выбора

import {select, ...} from 'redux-saga/effects'

function* deserialize( action ) {
    const state = yield select();
    ....
    yield put({ type: 'DESERISLIZE_COMPLETE' });
}

также вы можете использовать его с селекторами

const getItems = state => state.items;

function* deserialize( action ) {
    const items = yield select(getItems);
    ....
    yield put({ type: 'DESERISLIZE_COMPLETE' });
}

Ответ 2

Эффект Select не помогает нам, если мы выполняем функции обратного вызова, когда Saga не обрабатывает поток кода. В этом случае просто getState dispatch и getState в корневую сагу:

store.runSaga(rootSaga, store.dispatch, store.getState)

И параметры прохождения для детских саг

export default function* root(dispatch, getState) { yield all([ fork(loginFlow, dispatch, getState), ]) }

А затем в виде часов

export default function* watchSomething(dispatch, getState)...