【发布时间】:2018-04-03 14:08:51
【问题描述】:
传奇宣言
function* DoStuffInSaga({myRef}){
try {
console.info("saga running");
return yield delay(1000, 1);
}
catch(error){
console.warn(error);
}
}
export function* mySaga(){
yield all([
yield takeLatest(DO_STUFF_ACTION, DoStuffInSaga)
]);
}
从 index.js 暴露的 Saga
export { mySaga } from './mySaga';
传奇初始化
import * as sagas from './';
const initSagas = (sagaMiddleware) => {
(Object.keys(sagas).map(key => sagas[key])||[]).forEach(sagaMiddleware.run.bind(sagaMiddleware));
}
export default initSagas;
如果我记录 Object.keys(sagas),列表中提到了 saga,所以我认为 Saga 已经开始。
这个函数是从 store 中调用的:
initSagas(sagaMiddleWare);
行动号召
我有一个演示组件可以做到这一点:
import { doStuff } from '../../actions';
function mapDispatchToProps(dispatch) {
return {
doStuff: () => dispatch(doStuff())
};
}
doStuff 在哪里:
export const DO_STUFF_ACTION = 'DO_STUFF_ACTION';
export function doStuff(myRef) {
console.info('At doStuff action', myRef);
return { type: DO_STUFF_ACTION, myRef };
}
该动作是通过点击材质 UI 图标调用的:
import { doStuff } from '../../actions';
function DoStuff(){
doStuff('my-ref-key');
}
<Print className={classes.iconWithText} onClick={DoStuff} />
我的问题
“At doStuff action”正在被记录,它看起来(在我看来)应该是 Saga 正在运行,但它似乎没有在监听传入的动作,因为 saga 没有记录任何内容。 我错过了什么?
更新
这与调用所需操作的方式有关。现在它是在单击图标时触发的,如果我在当前页面组件的
componentDidMount上触发它,则调用 saga 就好了。
【问题讨论】:
标签: javascript reactjs ecmascript-6 redux-saga