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 并每次生成一个新状态。
我对 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 并每次生成一个新状态。