Odpowiedzi:
Jak już mówi @markerikson, redux-sagaujawnia bardzo przydatne API, select()które wywołuje selectorstan w celu uzyskania jego części dostępnej w sadze.
Na przykład prostą implementacją może być:
/*
* Selector. The query depends by the state shape
*/
export const getProject = (state) => state.project
// Saga
export function* saveProjectTask() {
while(true) {
yield take(SAVE_PROJECT);
let project = yield select(getProject); // <-- get the project
yield call(fetch, '/api/project', { body: project, method: 'PUT' });
yield put({type: SAVE_PROJECT_SUCCESS});
}
}
Oprócz sugerowanego dokumentu autorstwa @markerikson, istnieje bardzo dobry samouczek wideo autorstwa D. Abramova, który wyjaśnia, jak korzystać selectorsz Redux. Sprawdź też ten ciekawy wątek na Twitterze.
Do tego służą funkcje „selektora”. Przekazujesz im całe drzewo stanu, a oni zwracają część stanu. Kod, który wywołuje selektor nie musi wiedzieć, gdzie w państwie, które dane było tylko, że został zwrócony. Zobacz http://redux.js.org/docs/recipes/ComputingDerivedData.html po kilka przykładów.
W sadze select()API może służyć do wykonywania selektora.
Użyłem eventChannel do wywołania akcji z wywołania zwrotnego w funkcji generatora
import {eventChannel} from 'redux-saga';
import {call, take} from 'redux-saga/effects';
function createEventChannel(setEmitter) {
return eventChannel(emitter => {
setEmitter(emitter)
return () => {
}
}
)
}
function* YourSaga(){
let emitter;
const internalEvents = yield call(createEventChannel, em => emitter = em)
const scopedCallback = () => {
emitter({type, payload})
}
while(true){
const action = yield take(internalEvents)
yield put(action)
}
}