0

我正在使用 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是 true,我的计时器对象也不会运行。

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

4

1 回答 1

1

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

我认为这在设计上实际上是正确的。当您重现记录的日志时,您希望一切都像以前发生的那样发生,就产生的操作而言。

例如,在重放操作时,您可能不想从您的计算机触发真正的 AJAX 请求,而可能希望重放过去在该用户会话期间发送的记录的 AJAX 响应。

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

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

如果您正在构建一个库,您可能也不应该依赖可用的 thunk 中间件。似乎您在动作创建者中依赖它。如果不了解您的确切用例,很难说更多。

于 2016-04-15T21:44:56.617 回答