我在我的应用程序中使用 saga 注入时遇到了一些糟糕的时间,有时 saga 在动作被调度之前加载并且一切正常,有时动作被触发并且没有触发 saga 效果。我正在使用非常标准的代码,这是我的路线:
getComponent(nextState, cb) {
const importModules = Promise.all([
import ('containers/HostArea/reducer'),
import ('containers/HostArea/ActivityRegistration/reducer'),
import ('containers/HostArea/AccommodationRegistration/reducer'),
import ('containers/HostArea/sagas'),
import ('containers/HostArea/'),
]);
const renderRoute = loadModule(cb);
importModules.then(([hostAreaReducer, registerActivityReducer, registerAccommodationReducer, sagas, component]) => {
injectReducer('hostArea', hostAreaReducer.default);
injectReducer('registerActivity', registerActivityReducer.default);
injectReducer('registerAccommodation', registerAccommodationReducer.default);
injectSagas(sagas.default);
renderRoute(component);
});
importModules.catch(errorLoading);
},
这是我的传奇(我删除了getCurrentHost
,getHostRegistrations
但当然它们是在同一个文件中定义的):
export function* currentHostWatcher() {
yield takeLatest(GET_CURRENT_HOST, getCurrentHost);
}
export function* getHostRegistrationsWatcher() {
console.log('getHostRegistrationsWatcher');
yield takeLatest(GET_HOST_REGISTRATIONS, getHostRegistrations);
}
export default [
currentHostWatcher,
getHostRegistrationsWatcher,
];
这是我的组件的相关部分:
componentDidMount() {
console.log('componentDidMount');
this.props.dispatch(getCurrentHost({ resolve: ((host) => this.hostAuthenticated(host)), reject: () => this.unauthenticated() }));
}
hostAuthenticated(host) {
console.log('host is authenticated, get his registrations');
this.props.dispatch(getHostRegistrations({
host,
resolve: this.onRegistrationsLoaded,
reject: ((err) => console.log(err)),
}));
}
基本上我所做的是在 componentDidMount 上调度一个动作,并在成功调度第二个动作时,两者都在同一个 saga 中定义。我看到的是用同样的代码,只是刷新页面,有时控制台日志会显示
componentWillMount
componentDidMount
getCurrentHost
getCurrentHostSuccess
getHostRegistrations
但在 上没有调用任何效果getHostRegistrations
。其他时候,一切正常,我在日志中看到:
getHostRegistrationsWatcher
componentWillMount
componentDidMount
getCurrentHost
getCurrentHostSuccess
getHostRegistrations
host registrations loaded
如您所见,在第二种情况下,观察程序在组件安装之前执行并且流程正确。所以我的问题是:有没有办法确保在安装组件之前注入 saga?或任何其他解决方法?
如果您想查看实际代码,只需在此处注册https://www.amavido.it/join(使用随机电子邮件/姓名而不是 facebook);登录后,刷新,有时会看到渲染组件,有时会看到永远挂起的加载指示器)