나는 잠시 동안 Redux-Saga를 내 React/Redux 응용 프로그램에 통합하려고 노력해 왔으며, 누락 된 일부 핵심 요소가 있습니다 (작동하지 않으므로). rootSaga
기능에Redux-Saga에서 누락 된 점은 무엇입니까?
- , 나는 특정 작업이 발생하는 것을 감시하는 '감시자를 "오프 포크 다음과 같이는
이 작동하도록되어 방법의 나의 이해이다.
- 감시자가 작업을 볼 때 해당 작업에 대한 처리기를 호출하고 완료 될 때 적절한 성공/실패 작업을 호출합니다.
- 관찰자가 볼 수 있도록 조치를 지정하려면
put
또는call
을 사용해야합니다.
다음은 작동하기 위해 (개념적으로) 익숙해 진 코드입니다. (코드는 급하게 익명으로 처리되었으므로 오타를 용서하십시오.)
내 sagas.ts 파일 :
import { all, call, fork, put, takeLatest} from 'redux-saga/effects';
import { fromJS } from 'immutable';
import AppRedux, { IAction } from 'app/containers/App/reducers';
const fetchData = async (id: string, name: string): Promise<any> => {
console.log('calling fetchData');
const resource = `someurl?id=${id}`;
const data = await((await fetch(resource)).json()); // request(resource);
console.log('returning fetchData');
return fromJS({
id: id,
name,
data,
});
};
const callFetchData = function* callFetchData(action: IAction) {
console.log('calling callFetchData*');
try {
const result = yield call(fetchData, action.id, action.name);
yield put({
type: AppRedux.Action.DATA_FETCHED,
result,
});
} catch (error) {
yield put({
type: AppRedux.Action.FETCH_FAILED,
error,
});
}
console.log('exiting callFetchData*');
};
const watchCallFetchData = function* watchCallFetchData(action: IAction): IterableIterator<any> {
console.log('calling watchCallFetchData*');
yield* takeLatest(AppRedux.Action.FETCH_DATA, callFetchData, action)[Symbol.iterator];
console.log('exiting watchCallFetchData*');
};
export function* rootSaga(action: IAction): IterableIterator<any> {
console.log('calling rootSaga*');
const watcher = yield all([
fork(watchCallFetchData, action),
]);
console.log('exiting rootSaga*');
}
export default [
rootSaga,
];
내 routes.ts 파일 :
이import { RouterState } from 'react-router';
import { ComponentCallback, errorLoading, loadModule } from 'app/routes';
import AppRedux from 'app/containers/App/reducers';
import { call, put } from 'redux-saga/effects';
path: '/somepath/:id',
async getComponent(nextState: RouterState, cb: ComponentCallback) {
try {
const renderRoute = loadModule(cb);
const [reducer, sagas, component] = await importModules();
const id = nextState.params.id;
const name = '';
const action = {
id,
name,
type: AppRedux.Action.FETCH_DATA,
};
console.log('routes.ts pre-put fetch_data');
const putResult = put(action);
console.log('routes.ts post-put fetch_data');
return renderRoute(component);
} catch (err) {
errorLoading(cb)(err);
}
},
내 app.tsx 파일 : 여기
import * as React from 'react';
import * as ReactRouter from 'react-router';
import { connect, DispatchProp } from 'react-redux';
import AppRedux from 'app/containers/App/reducers';
import { createStructuredSelector } from 'reselect';
import { selectid, selectResponses, selectname } from 'app/containers/App/selectors';
import { ISection } from './data';
export class App extends React.Component<IProps, {}> {
constructor(props: Readonly<IProps>) {
super(props);
console.log('app-constructor');
}
public render() {
console.log('app-render');
return (<div className="app" />);
}
}
export default connect<{}, {}, IProps>(
createStructuredSelector({
id: selectId(),
data: selectData(),
name: selectName(),
}),
(dispatch) => ({
fetchData: (id: string, name: string) => dispatch(AppRedux.fetchData(id, name)),
dispatch,
}),
)(App);
이 console.log
의 출력입니다 전화 :
calling rootSaga*
calling watchCallFetchData*
exiting watchCallFetchData*
exiting rootSaga*
routes.ts pre-put fetch_data
routes.ts post-put fetch_data
app-constructor
app-render
편집 : 명확한 설명 나는 일이 기대
:
- 내가 실제로 뭔가를 할 수있는 사가 액션과 돌아 오는-사가를 위해 파견하는
put(action)
를 기대합니다. - 나는 함수
callFetchData
을 호출 할 것이고, 비슷하게fetchData
을 호출 할 것으로 기대한다. console.log
에서exiting watchCallFetchData*
을보기 전에 두 호출이 모두 발생하기를 기대합니다.- (어느 시점에서) "A-ha!" 순간.
rootSaga*
함수가 호출됩니다 : 실제로 무슨 일
.
watchCallFetchData*
이 두 번 호출됩니까? (가정은yield
진술이 가정 한 내용을 기반으로합니다).rootSaga*
함수가 다시 호출됩니다. (가정은yield
진술이 가정 한 내용을 기반으로합니다).- "A-ha!" 순간이 나를 계속 피합니다.
3의 경우, 감시자가 선택하도록하려면 'put'을 사용하여 작업을 전달하십시오. –
질문을 수정해야한다고 생각합니다. 코드는 무엇을하고 무엇을하기를 기대합니까? 사가가 발동되지 않습니까? 문제가 정확히 무엇입니까? –
@CoryDanielson은 "3"으로 3 번째 코드 파일을 의미합니까? 나는 내 노선에'put '을 사용하고 있습니다 .ts .. – pete