Jawaban:
Seperti yang sudah dikatakan @markerikson, redux-saga
mengekspos API yang sangat berguna select()
untuk memanggil selector
status agar beberapa bagiannya tersedia di dalam saga.
Untuk contoh Anda, penerapan sederhana dapat berupa:
/*
* 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});
}
}
Selain dokumen yang disarankan oleh @markerikson, ada video tutorial yang sangat bagus oleh D. Abramov yang menjelaskan cara menggunakan selectors
Redux. Periksa juga utas menarik ini di Twitter.
Untuk itulah fungsi "selector". Anda memberikan mereka seluruh pohon negara bagian, dan mereka mengembalikan sebagian negara bagian. Kode yang memanggil pemilih tidak perlu tahu di mana dalam keadaan itu data itu, hanya saja itu dikembalikan. Lihat http://redux.js.org/docs/recipes/ComputingDerivedData.html untuk beberapa contoh.
Dalam saga, select()
API dapat digunakan untuk menjalankan selektor.
Saya menggunakan eventChannel untuk mengirimkan tindakan dari callback dalam fungsi generator
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)
}
}