जवाबों:
जैसा कि @markerikson पहले से ही कहते हैं, गाथा के अंदर इसका कुछ हिस्सा उपलब्ध होने के लिए राज्य पर आह्वान करने के लिए redux-saga
एक बहुत ही उपयोगी एपीआई 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});
}
}
सुझाव के अलावा डॉक @markerikson से, वहाँ एक बहुत अच्छा है वीडियो ट्यूटोरियल डी अब्रामोव द्वारा जो बताते हैं उपयोग करने के लिए कैसे selectors
Redux साथ। इस दिलचस्प सूत्र को ट्विटर पर भी देखें ।
यह "चयनकर्ता" फ़ंक्शन के लिए है। आप उन्हें पूरे राज्य के पेड़ से गुजरते हैं, और वे राज्य का कुछ टुकड़ा वापस करते हैं। चयनकर्ता को कॉल करने वाले कोड को यह जानने की आवश्यकता नहीं है कि डेटा कहां था, बस उसी स्थिति में उसे लौटा दिया गया था। कुछ उदाहरणों के लिए http://redux.js.org/docs/recipes/ComputingDerivedData.html देखें ।
एक गाथा के भीतर, select()
एपीआई का उपयोग चयनकर्ता को निष्पादित करने के लिए किया जा सकता है।
मैंने जनरेटर फ़ंक्शन के भीतर कॉलबैक से एक कार्रवाई को भेजने के लिए एक इवेंटचैनल का उपयोग किया
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)
}
}