【问题标题】:Replaying actions in Redux在 Redux 中重放操作
【发布时间】:2016-04-14 18:00:30
【问题描述】:

我正在使用 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 总是会直接挂载到根状态。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    我认为计时器属于同一类:从 Redux 的角度来看,动作历史描述副作用“导致”发生了什么,并且重放动作应该足以让你即使这些副作用实际上并没有再次触发,应用程序也会进入相同的状态。

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-24
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2017-04-01
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多