我正在使用Redux构建一个涉及使用计时器的库。我有一个动作创建者,可以调度START_TIMER
事件,还应该在计时器对象上调用start
。代码如下所示:
// thunk action creator
const startTimer = () => (dispatch, getState) => {
if (!getState().timer.isRunning)
externalTimerObject.start()
dispatch({
type: 'START_TIMER'
})
}

我试图解决两个问题:
如果我想将我的操作记录到数据库或localStorage,以便我可以重播它们以达到一致的应用程序状态,那么即使rootState.timer.isRunning
为真,我的计时器对象也不会运行。
条件if (!getState().timer.isRunning)
要求我知道根状态timer
的安装位置。由于我将其构建为库,因此我不能假设timer
总是直接挂载到根状态。
答案 0 :(得分:1)
如果我想将我的操作记录到数据库或localStorage,以便我可以重播它们以达到一致的应用程序状态,那么即使rootState.timer.isRunning为true,我的计时器对象也不会运行。
我认为这实际上是正确的设计。当您重现录制的日志时,您希望在生成的操作方面完全按照之前发生的一切发生。
例如,在重放动作时,您可能希望重播过去在该用户会话期间调度的录制的AJAX响应,而不是从您的计算机发出真正的AJAX请求。
我认为计时器属于同一类别:从Redux的角度来看,行动历史记录描述副作用的“结果”,重播动作应该足以让你的应用程序进入相同的状态,即使这些副作用实际上没有再次发射。
条件if(!getState()。timer.isRunning)要求我知道挂载根状态计时器的位置。由于我将其构建为库,因此我无法假设计时器始终直接安装在根状态上。
如果您正在构建库,那么您也可能不应该依赖可用的thunk中间件。看起来你在你的动作创作者中依赖它。如果不了解您的具体用例,很难说更多。