所以我在路由加载时动态注入 Sagas
path: '/home',
name: 'home',
getComponent(nextState, cb) {
require.ensure([],
require => {
let HomePageReducer = require('./containers/HomePage/reducer').default;
let HomePageSagas = require('./containers/HomePage/sagas').default;
let HomePage = require('./containers/HomePage').default;
injectReducer('home', HomePageReducer);
injectSagas(HomePageSagas);
cb(null, HomePage);
})
},
injectAsyncSagas
像这样:
export function injectAsyncSagas(store) {
return (sagas) => sagas.map(store.runSaga);
}
在哪里store.runSaga
,sagaMiddleware.run
在商店创建期间创建。
当路由加载时,saga 成功启动。它正在监听动作。
export function* mySagaFunction() {
console.log("Start mySagaFunction");
while (true) {
const watcher = yield race({
loadRepos: take(SOME_HOME_PAGE_ACTION),
stop: take(LOCATION_CHANGE), // stop watching if user leaves page
});
if (watcher.stop) {
console.log("Stop mySagaFunction", watcher.stop);
break;
}
//other statements here to handle SOME_HOME_PAGE_ACTION
}
当我加载路线时,“Start mySagaFunction”得到了安慰。如果我派遣 SOME_HOME_PAGE_ACTION,它会成功完成它必须做的任何事情。当我离开页面时,反应路由器调用 LOCATION_CHANGE,Saga 控制台“停止 mySagaFunction”,暗示它成功退出了 while 循环。
然后我去另一条路线,然后回到这条路线。这次 LOCATION_CHANGE 由路由器分派,正如预期的那样。但 Saga 正在启动,然后立即停止。我的控制台是这样的:
Start mySagaFunction
Stop mySagaFunction
在 Redux 开发工具中,我只看到一个 LOCATION_CHANGE。我如何弄清楚为什么 Saga 开始并立即停止?只有当我回到路线时才会发生这种情况。
我想也许 LOCATION_CHANGE 派送晚了。但不是。在我的减速器中,我安慰了动作类型。首先使用 LOCATION_CHANGE 调用 Reducer,然后 saga 开始,然后 saga 停止。
我Link
用来在页面之间导航。我也试过browserHistory.push(url)
了dispatch(push(url))
。结果相同。
注意:我得到了从react-boilerplate注入 sagas 的代码。我只使用了这段代码,我没有使用样板本身。我运行了样板文件,但那里没有发生此错误。区别在于:
- 它
selectLocationState
在 syncHistoryWithStore 中使用。我的整个商店都不是不可变的,所以我不需要它。 - 它使用它自己的
routeReducer
而不是routerReducer
fromreact-router-redux
。我不知道为什么,可能是因为完整的不可变存储。
无论如何,在样板代码中,我删除了上述两点,但仍然没有发生这种情况。