[javascript] redux-saga 함수 내에서 상태 / 스토어에서 무언가를 얻는 방법은 무엇입니까?

saga 함수 내에서 redux 상태에 어떻게 액세스합니까?

짧은 답변:

import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);



답변

@markerikson이 이미 말했듯이, redux-saga는 사가 내에서 일부를 사용할 수 있도록 상태 select()를 호출하는 데 매우 유용한 API 를 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 이 제안한 문서 외에도 Redux와 함께 사용하는 방법을 설명하는 D. Abramov 의 매우 좋은 비디오 자습서 가 있습니다 selectors. Twitter 에서이 흥미로운 스레드를 확인하십시오 .


답변

이것이 “선택기”기능의 용도입니다. 전체 상태 트리를 전달하고 상태의 일부를 반환합니다. 선택기를 호출하는 코드는 알 필요가없는 이 반환 단지, 데이터가 있었다 상태에서. 몇 가지 예는 http://redux.js.org/docs/recipes/ComputingDerivedData.html 을 참조하십시오 .

saga 내에서 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)
    }
}


답변