我在应用程序中使用redux和redux-saga来管理状态和异步操作。为了使我的生活更轻松,我编写了一个类,该类本质上充当了传奇经理,并使用了一种“注册”传奇的方法。此注册方法派生新的传奇,并使用redux-saga/effects/all
将其与所有其他注册的传奇结合起来:
class SagasManager {
public registerSaga = (saga: any) => {
this._sagas.push(fork(saga));
this._combined = all(this._sagas);
}
}
我的商店然后使用该类来获取_combined
传奇,据说是在注册了所有的传奇之后:
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
,它具有取消的方法等,但是由于我的问题仅在于构造商店和呈现应用程序之间的尴尬时间,我不这样做。这将是一个问题。
任何人都可以解释这是否安全,如果不能解决,那么会有什么更好的解决办法?