Javascript 如何使用函数方法从内部范围更新值?
我有一个例子,我从一个客户端得到一个由两个字符串组成的数组,然后在服务器端映射它们,为每个字符串打开一个流。(在代码示例中,我使用的是Javascript 如何使用函数方法从内部范围更新值?,javascript,node.js,functional-programming,ramda.js,Javascript,Node.js,Functional Programming,Ramda.js,我有一个例子,我从一个客户端得到一个由两个字符串组成的数组,然后在服务器端映射它们,为每个字符串打开一个流。(在代码示例中,我使用的是setInterval,而不是真实的数据流,以使事情尽可能简单。) 我也在一个对象中重新构造了这个数据,所以我可以保留一些值,稍后我会更新这些值。无论何时触发setInterval,我都会增加与我映射的迭代对象对应的键的值 const stream = (arr) => { // arr = ['firstValue', 'secondValue'
setInterval
,而不是真实的数据流,以使事情尽可能简单。)
我也在一个对象中重新构造了这个数据,所以我可以保留一些值,稍后我会更新这些值。无论何时触发setInterval
,我都会增加与我映射的迭代对象对应的键的值
const stream = (arr) => {
// arr = ['firstValue', 'secondValue']
// the object to store the values which will be sent to the client
const restructure = {
[arr[0]]: 0,
[arr[1]]: 0
}
arr.map((i) => {
// setInterval as a placeholder stream
setInterval(() => {
restructure[i]++
// instead of logging, the updated object is sent to client
console.log(restructure)
}, 2000)
})
}
在提升值之后,我将更新的对象发送回客户端。显然这是可行的,但我想用一种更实用的方法来完成这个更新操作
我尝试了Ramda和Lodash/Fp中的一些方法,但似乎不可能从不同的范围更新对象
通常情况下,最终的结果是这些值被碰撞,然后在下一个间隔返回到原始值
是否有一种可行的方法可以通过某种功能性的
setState
从内部范围更新此数据?Ramda的设计原则是从不修改用户数据。这并不意味着你不能使用Ramda,但是Ramda函数本身并不能帮助你做到这一点。这是故意的,;不变数据结构是函数式编程的重要概念之一
对于您的示例,我注意到的第一件事是,流
函数不返回任何内容。同样,这在FP中是一件奇怪的事情
现在,关于在函数中使用Ramda,例如,您可以从使用let restructure=fromPairs(map(key=>[key,0],arr])
开始
在您的setInterval
中,您可以通过类似restructure=evolve({[i]:R.inc},restructure)
的方式重置restructure
自己的价值
综上所述,我们可以得到类似于您的示例的
const stream = (arr) => {
let restructure = fromPairs(map(key => [key, 0], arr));
R.map((key) => {
setInterval(() => {
restructure = evolve({[key]: R.inc}, restructure
console.log(restructure);
}, 2000)
}, arr)
return () => restructure
}
同样,Ramda实际上并没有就地更新该变量。但这肯定不会阻止你重新分配它
您可以在中看到这方面的细微变化,Ramda的设计原则是从不修改用户数据。这并不意味着你不能使用Ramda,但是Ramda函数本身并不能帮助你做到这一点。这是故意的,;不变数据结构是函数式编程的重要概念之一 对于您的示例,我注意到的第一件事是,
流
函数不返回任何内容。同样,这在FP中是一件奇怪的事情
现在,关于在函数中使用Ramda,例如,您可以从使用let restructure=fromPairs(map(key=>[key,0],arr])
开始
在您的setInterval
中,您可以通过类似restructure=evolve({[i]:R.inc},restructure)
的方式重置restructure
自己的价值
综上所述,我们可以得到类似于您的示例的
const stream = (arr) => {
let restructure = fromPairs(map(key => [key, 0], arr));
R.map((key) => {
setInterval(() => {
restructure = evolve({[key]: R.inc}, restructure
console.log(restructure);
}, 2000)
}, arr)
return () => restructure
}
同样,Ramda实际上并没有就地更新该变量。但这肯定不会阻止你重新分配它
在函数方法中,您可以在中看到这方面的细微变化,您不更新值。创建新的值。在函数方法中,不更新值。您创建了新的流。您在REPL中的示例在模拟我的实际流方面做得很好,并且运行得很好。您在REPL中的示例在模拟我的实际流方面做得很好,并且运行得很好。