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中的示例在模拟我的实际流方面做得很好,并且运行得很好。