setInterval 修改全局状态

setInterval modifying global state

我对 Javascrit 和 Redux 还很陌生。我查阅了几个参考资料,发现了这篇关于 Redux 中间件的文章:https://www.codementor.io/@vkarpov/beginner-s-guide-to-redux-middleware-du107uyud

作者声明 reducer 不应该修改全局状态(因此是纯函数),因此 reducer 不应该使用像 setInterval.

这样的函数

如果我没理解错的话,这意味着 setInterval 确实修改了全局状态。我的问题是 setInterval 修改全局状态的方式和部分?

如有任何详细信息,我们将不胜感激。

谢谢。

Reducer 不应该负责管理异步操作。 setInterval 本身不会修改全局状态,但如果从 reducer 内部调用它,它确实有可能通过对象引用访问和修改状态。

此规则的目的是让您的代码保持干净、专注和简单。因此,reducer 应该采用一个状态和一个动作,并同步生成一个新状态。没有其他恶作剧。

这就是 Redux Thunk 和 Redux Sagas 存在的原因。它们使我们能够处理异步操作的多个阶段,同时将逻辑保持在 reducer 之外。

例如,想象一下下面的减速器:

// Simple reducer that ignores action and just adds 1 to
// state count every time
function myReducer(state, action) {
    return {
        count: state.count + 1
    };
}

// Reducer that calls setInterval
function myBadReducer(state, action) {
    // When our reducer gets called we create an interval
    // that increases count directly by 1 every 2 seconds
    // BTW This is exceptionally bad since it creates a duplicate
    // interval everytime the reducer is invoked.
    setInterval(() => {
        state.count += 1;
    }, 2000);

    return state;
}

坏的 reducer 直接通过引用修改状态,这破坏了 redux 为我们创建的流程。 State-->Action-->Reducer-->New State。这使得 Redux 无法有效地通知所有订阅者状态已更改,因为它没有监视每个内存地址。

相反,您应该在 reducer 之外设置一个单独的进程(或使用 Redux Sagas),根据需要(按时间间隔或其他方式)调用一个动作,并让 store 处理调用 reducer 并每次生成一个新状态。