getState в redux-saga?

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

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

dispatch( deserializeItems() );

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

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

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

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

2 ответов


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

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' });
}

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

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

и параметры передачи в дочерние саги

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

а потом в watch methods

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