Javascript setInterval修改全局状态

Javascript setInterval修改全局状态,javascript,redux,setinterval,Javascript,Redux,Setinterval,我对Javascrit和Redux还很陌生。我查阅了几篇参考文献,发现了这篇关于Redux中间件的文章: 作者指出,减缩器不应该修改全局状态(因此是纯函数),因此减缩器不应该使用像setInterval这样的函数 如果我理解正确,这意味着setInterval会修改全局状态。我的问题是setInterval如何修改全局状态以及修改全局状态的哪一部分 任何形式的细节都将不胜感激 谢谢。还原程序不应负责管理异步操作。setInterval不会固有地修改全局状态,但如果从减速器内部调用它,它确实有可能

我对Javascrit和Redux还很陌生。我查阅了几篇参考文献,发现了这篇关于Redux中间件的文章:

作者指出,减缩器不应该修改全局状态(因此是纯函数),因此减缩器不应该使用像
setInterval
这样的函数

如果我理解正确,这意味着
setInterval
会修改全局状态。我的问题是
setInterval
如何修改全局状态以及修改全局状态的哪一部分

任何形式的细节都将不胜感激


谢谢。

还原程序不应负责管理异步操作。setInterval不会固有地修改全局状态,但如果从减速器内部调用它,它确实有可能通过对象引用访问和修改状态

此规则的目的是保持代码干净、集中和简单。因此,还原程序应该采取一个状态和一个动作,并同步生成一个新状态。没有其他恶作剧

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

例如,想象以下减速器:

//忽略操作并仅向
//每次州计数
函数myReducer(状态、操作){
返回{
计数:state.count+1
};
}
//调用setInterval的减速机
函数myBadReducer(状态、操作){
//当调用reducer时,我们创建一个间隔
//这会使计数每2秒直接增加1
//顺便说一句,这是非常糟糕的,因为它创建了一个副本
//每次调用减速器时的间隔。
设置间隔(()=>{
state.count+=1;
}, 2000);
返回状态;
}
坏的减速器直接通过引用修改状态,这破坏了redux为我们创建的流。状态-->操作-->减速器-->新状态。这使得Redux无法有效地通知所有订阅者状态已更改,因为它没有监视每个内存地址


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

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

此规则的目的是保持代码干净、集中和简单。因此,还原程序应该采取一个状态和一个动作,并同步生成一个新状态。没有其他恶作剧

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

例如,想象以下减速器:

//忽略操作并仅向
//每次州计数
函数myReducer(状态、操作){
返回{
计数:state.count+1
};
}
//调用setInterval的减速机
函数myBadReducer(状态、操作){
//当调用reducer时,我们创建一个间隔
//这会使计数每2秒直接增加1
//顺便说一句,这是非常糟糕的,因为它创建了一个副本
//每次调用减速器时的间隔。
设置间隔(()=>{
state.count+=1;
}, 2000);
返回状态;
}
坏的减速器直接通过引用修改状态,这破坏了redux为我们创建的流。状态-->操作-->减速器-->新状态。这使得Redux无法有效地通知所有订阅者状态已更改,因为它没有监视每个内存地址


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

谢谢您的回答。您能否提供一个简短的代码段,它在reducer中调用setInterval,并通过对象引用访问和修改状态?再次感谢你,谢谢你的例子。接下来的一个问题是,我认为您的BadReducer不好的原因是因为我们将代码修改状态直接放在setInterval中,而这不是setInterval的错误。如果state.count+=1,而不是返回一个新的staye,那么您的good reducer中也会有同样的问题。我遗漏了什么吗?你是对的,不,你没有遗漏任何东西。这篇文章在描述全局状态的修改时有点模棱两可。您可以看到,它将间隔附加到中间件中的操作,这是正常的,但是从reducer执行此操作将被认为不是最佳实践。和我这里的想法一样。保持减速器简单明了,明白了。谢谢你的帮助!谢谢你的回答。您能否提供一个简短的代码段,它在reducer中调用setInterval,并通过对象引用访问和修改状态?再次感谢你,谢谢你的例子。接下来的一个问题是,我认为您的BadReducer不好的原因是因为我们将代码修改状态直接放在setInterval中,而这不是setInterval的错误。如果state.count+=1,而不是返回一个新的staye,那么您的good reducer中也会有同样的问题。我遗漏了什么吗?你是对的,不,你没有遗漏任何东西。这篇文章在描述全局状态的修改时有点模棱两可。您可以看到,它将间隔附加到中间件中的操作,这是正常的,但是从reducer执行此操作将被认为不是最佳实践。和我这里的想法一样。保持减速器简单明了,明白了。谢谢你的帮助!