2016-07-15 8 views
23

Mam sklep z listą przedmiotów. Kiedy moja aplikacja ładuje się najpierw, muszę deserializować elementy, tak jak w przypadku tworzenia obiektów w pamięci na podstawie elementów. Pozycje są przechowywane w moim sklepie redux i obsługiwane przez itemsReducer.getState w Redx-saga?

Próbuję użyć redux-saga do obsługi deserializacji, jako efekt uboczny. Na pierwszej stronie obciążenia, ja wysyłają skargi:

dispatch(deserializeItems()); 

Moja saga jest ustawiona prosto:

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

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

W moim deserializowania sagi, gdzie chcę, aby poradzić sobie z efektem ubocznym tworzenia wersji w pamięci moich przedmiotów, muszę przeczytać istniejące dane ze sklepu. Nie jestem pewien, jak to zrobić tutaj, lub jeśli jest to wzorzec, którego powinienem próbować nawet przy użyciu sagi redux.

Odpowiedz

81

można użyć select effect

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

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

także można go używać z selektorów

const getItems = state => state.items; 

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

Wybierz efekt nie pomoże nam, jeśli w ciągu funkcji zwrotnych, gdy przepływ kod nie jest obsługiwana przez Saga. W tym przypadku po prostu przekazać dispatch i getState do korzeni sagi:

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

I przekazać parametry na dziecko sag

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

A potem w metodach zegarków

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

Powiązane problemy