【发布时间】:2018-09-14 02:29:55
【问题描述】:
我在应用程序中使用 redux 和 redux-saga 来管理状态和异步操作。为了让我的生活更轻松,我编写了一个基本上充当 saga 管理器的类,并带有一个“注册”saga 的方法。这个注册方法派生了新的 saga,并使用 redux-saga/effects/all 将它与所有其他注册的 saga 结合起来:
class SagasManager {
public registerSaga = (saga: any) => {
this._sagas.push(fork(saga));
this._combined = all(this._sagas);
}
}
然后我的商店使用这个类来获取_combined saga,据说在所有 saga 都注册之后:
const store = Redux.createStore(
reducer,
initialState,
compose(Redux.applyMiddleware(sagaMiddleware, otherMiddleware)),
);
sagaMiddleware.run(sagasManager.getSaga());
但是,我遇到了一个问题,即根据情况(如导入顺序),这并不总是按预期工作。发生的事情是,在调用 sagaMiddleware.run 之前,一些 sagas 没有被注册。
我通过在SagasManager 上提供回调来解决这个问题:
class SagasManager {
public registerSaga = (saga: any) => {
this._sagas.push(fork(saga));
this._combined = all(this._sagas);
this.onSagaRegister();
}
}
然后商店代码可以用这个作为
sagasManager.onSagaRegister = () => sagaMiddleware.run(sagasManager.getSaga());
这似乎有效,但我无法在文档中找到这是否安全。我确实看到.run 返回一个Task,它具有取消等方法,但由于我的问题只是在构建商店和呈现应用程序之间的那个尴尬时间,我不会那样做一个问题。
谁能解释这是否安全,如果不安全,还有什么更好的解决方案?
【问题讨论】:
标签: javascript reactjs typescript redux redux-saga