回答:
@markeriksonがすでに言っているように、を呼び出すためのredux-saga
非常に便利なAPI select()
を公開しますselector
ているように、saga内でその一部を利用できるように状態します。
あなたの例では、簡単な実装は次のようになります:
/*
* 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によって提案されたドキュメントに加えて、D。Abramovによる非常に優れたビデオチュートリアルがあり、selectors
Reduxでの使用方法を説明しています。Twitterのこの興味深いスレッドも確認してください。
これが「セレクタ」関数の目的です。状態ツリー全体を渡すと、状態の一部が返されます。セレクターを呼び出すコードは、データがどこにあるかを知る必要はなく、返されただけです。いくつかの例については、http://redux.js.org/docs/recipes/ComputingDerivedData.htmlを参照してください。
サガ内では、select()
APIを使用してセレクターを実行できます。
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)
}
}