2016-07-15 147 views
23

Ho un negozio con una lista di articoli. Quando la mia app viene caricata per la prima volta, ho bisogno di deserializzare gli elementi, come nel creare alcuni oggetti in memoria basati sugli elementi. Gli articoli sono memorizzati nel mio negozio redux e gestiti da un itemsReducer.getState in redux-saga?

Sto tentando di utilizzare redux-saga per gestire la deserializzazione, come effetto collaterale. Al primo caricamento della pagina, mi invio un'azione:

dispatch(deserializeItems()); 

mia saga è configurato semplicemente:

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

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

Nella mia saga deserializzare, dove voglio gestire l'effetto collaterale di creare versioni in memoria dei miei articoli, ho bisogno di leggere i dati esistenti dal negozio. Non sono sicuro di come farlo qui, o se quello è un modello che dovrei anche provare con redux-saga.

risposta

81

è possibile utilizzare select effect

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

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

inoltre è possibile utilizzarlo con selettori

const getItems = state => state.items; 

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

Selezionare effetto non ci aiuta se siamo in funzioni di callback, quando il flusso di codice non viene gestito di Saga. In questo caso basta passare dispatch e getState alla saga di root:

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

E il passare parametri a saghe bambino

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

E poi nei metodi di orologi

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