উত্তর:
যেমনটি @ মার্কেরিকসন ইতিমধ্যে বলেছেন, কাহিনীর অভ্যন্তরে এর কিছু অংশ উপলব্ধ করার জন্য রাজ্যে একটি অনুরোধ করার জন্য 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});
}
}
@ মার্কেরিকসনের প্রস্তাবিত ডক ছাড়াও, ডি আব্রামভের একটি খুব ভাল ভিডিও টিউটোরিয়াল রয়েছে যা রেডাক্সের selectors
সাথে কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করে । এছাড়াও চেক করুন এই টুইটারে আকর্ষণীয় থ্রেড।
এটিই "নির্বাচক" ফাংশনগুলির জন্য। আপনি তাদেরকে পুরো রাজ্য গাছটি দিয়ে দিন এবং তারা রাজ্যের কিছু অংশ ফেরত দেয়। যে কোডটি নির্বাচককে কল করে তাদের তথ্যের প্রয়োজন নেই যেখানে তথ্য ছিল কোথায়, কেবলমাত্র এটি ফিরে এসেছে। কিছু উদাহরণের জন্য http://redux.js.org/docs/recips/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)
}
}