重做Redux中的操作

时间:2016-04-14 18:00:31

标签: redux react-redux redux-framework redux-thunk

我正在使用Redux构建一个涉及使用计时器的库。我有一个动作创建者,可以调度START_TIMER事件,还应该在计时器对象上调用start。代码如下所示:



// thunk action creator
const startTimer = () => (dispatch, getState) => {
  
  if (!getState().timer.isRunning)
    externalTimerObject.start()

  dispatch({
    type: 'START_TIMER'
  })
  
}




我试图解决两个问题:

  1. 如果我想将我的操作记录到数据库或localStorage,以便我可以重播它们以达到一致的应用程序状态,那么即使rootState.timer.isRunning为真,我的计时器对象也不会运行。

  2. 条件if (!getState().timer.isRunning)要求我知道根状态timer的安装位置。由于我将其构建为库,因此我不能假设timer总是直接挂载到根状态。

1 个答案:

答案 0 :(得分:1)

  

如果我想将我的操作记录到数据库或localStorage,以便我可以重播它们以达到一致的应用程序状态,那么即使rootState.timer.isRunning为true,我的计时器对象也不会运行。

我认为这实际上是正确的设计。当您重现录制的日志时,您希望在生成的操作方面完全按照之前发生的一切发生。

例如,在重放动作时,您可能希望重播过去在该用户会话期间调度的录制的AJAX响应,而不是从您的计算机发出真正的AJAX请求。

我认为计时器属于同一类别:从Redux的角度来看,行动历史记录描述副作用的“结果”,重播动作应该足以让你的应用程序进入相同的状态,即使这些副作用实际上没有再次发射。

  

条件if(!getState()。timer.isRunning)要求我知道挂载根状态计时器的位置。由于我将其构建为库,因此我无法假设计时器始终直接安装在根状态上。

如果您正在构建库,那么您也可能不应该依赖可用的thunk中间件。看起来你在你的动作创作者中依赖它。如果不了解您的具体用例,很难说更多。