Antworten:
Wie @markerikson bereits sagt, redux-saga
stellt eine sehr nützliche API select()
zur Verfügung, mit der ein Status aufgerufen werden kann , um einen selector
Teil davon in der Saga verfügbar zu machen.
Für Ihr Beispiel könnte eine einfache Implementierung sein:
/*
* 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});
}
}
Zusätzlich zu dem vorgeschlagenen doc von @markerikson, ist es eine sehr gute Video - Tutorial von D. Abramov , die erklärt , wie die Verwendung selectors
mit Redux. Überprüfen Sie auch diesen interessanten Thread auf Twitter.
Dafür sind "Selektor" -Funktionen gedacht. Sie übergeben ihnen den gesamten Statusbaum und sie geben einen Teil des Status zurück. Der Code, der den Selektor aufruft, muss nicht wissen, wo sich die Daten befanden, sondern nur, dass sie zurückgegeben wurden. Einige Beispiele finden Sie unter http://redux.js.org/docs/recipes/ComputingDerivedData.html .
Innerhalb einer Saga kann die select()
API verwendet werden, um einen Selektor auszuführen.
Ich habe einen eventChannel verwendet, um eine Aktion von einem Rückruf innerhalb der Generatorfunktion auszulösen
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)
}
}