从redux中间件清除间隔

时间:2018-02-25 02:15:46

标签: reactjs redux react-redux

我的中间件看起来像



export const timerMiddleware = store => next => action => {
  if (action.type === "START_TIMER") {
    // console.log("timer");
    action.interval = setInterval(
      () => store.dispatch({ type: "TICK", currentTime: Date.now() }),
      1000
    );
    debugger;
  } else if (action.type === "STOP_TIMER") {
    //console.log(store);
    debugger;
    console.log(action.interval);
    clearInterval(action.interval);
  }
  next(action);
};




在启动计时器上,时钟正在滴答作响,但在stop_timer上,我松开了setInterval的引用。所以无法停止时钟。 我在这里失踪了什么。 https://codesandbox.io/s/xrmnwr7y8z

1 个答案:

答案 0 :(得分:2)

您可能不想改变动作。每次进入中间件时,您都会有一个新动作,因此您的间隔将会丢失。 action.interval也不符合flux标准动作模式。你可以在中间件之外放一些,比如

'background-color':'white'

然后去

let interval;
const timerMiddleware ...

然后是什么时候清除它

interval = setInterval // interval will now be a number which is a reference to your interval 

但是如果你想要更加不可变,你可以访问中间件中的商店

clearInterval(interval)

然后在您的reducer中,您可以将其存储在const interval = setInterval(...) store.dispatch({ type: "SET_YOUR_INTERVAL" payload: interval }); 或其他

state.someInterval

然后当您返回到中间件并且操作是“STOP_TIMER”时,您可以使用store.getState()来获取对当前状态的引用。然后你可以去case "SET_YOUR_INTERVAL": return { someInterval: action.payload }

然后store.dispatch你可以调度一个动作来清理状态区间

有关setTimeout和setInterval的返回值的更多信息:setInterval/setTimeout return value