Как мне получить доступ к избыточному состоянию внутри саги?
Короткий ответ:
import { select } from 'redux-saga';
...
let data = yield select(stateSelectorFunction);
Как мне получить доступ к избыточному состоянию внутри саги?
Короткий ответ:
import { select } from 'redux-saga';
...
let data = yield select(stateSelectorFunction);
Как уже говорит @markerikson, redux-saga
предоставляет очень полезный API select()
для вызова selector
в состоянии для получения часть его доступна внутри саги.
Для вашего примера простая реализация может быть:
/*
* 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});
}
}
В дополнение к предложенному doc от @markerikson, есть очень хороший видео-учебник Д. Абрамова, в котором объясняется, как использовать selectors
с помощью Redux. Также проверьте эту интересную тему в Twitter.
Для этого предназначены функции "селектора". Вы передаете им все дерево состояний, и они возвращают какой-то кусок штата. Код, который вызывает селектор, не должен знать, где в состоянии находились данные, просто чтобы они были возвращены. См. Http://redux.js.org/docs/recipes/ComputingDerivedData.html для некоторых примеров.
В рамках саги API select()
может использоваться для запуска селектора.
Я использовал eventChannel для отправки действия из обратного вызова в функции генератора
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)
}
}