gpt4 book ai didi

javascript - 异步系统中的不可变数据

转载 作者:行者123 更新时间:2023-12-03 06:56:53 25 4
gpt4 key购买 nike

我很清楚在应用程序中使用不可变数据的好处,并且我对在简单的同步编程环境中使用这些不可变结构的想法相当满意。

Stack Overflow 上有一个很好的例子,它描述了通过一系列递归调用传递状态来管理游戏状态,如下所示:

function update(state) {
sleep(100)

return update({
ticks: state.ticks + 1,
player: player
})
}

我们可以在函数体内做一些任意的、无副作用的工作,然后我们返回一个新的状态,而不是改变旧的状态。

将其转换为简单的异步模型(例如 Javascript)似乎相当容易。

function update(state) {
const newState = {
player,
ticks: state.ticks + 1
};

setTimeout(update.bind(this, newState), 100);
}

但是,一旦我们拥有更多的异步事件源,保持状态不可变和函数纯净似乎就变得更加困难。

如果我们向示例添加点击事件,我们最终会得到如下所示的代码。

window.addEventListener('click', function() {
// I have no idea what the state is
// because only our update loop knows about it
});

现在显然,我不想改变此方法中的状态,但我需要访问状态才能创建新状态,如下所示。

window.addEventListener('click', function() {
const state = getState();

createState({
player,
clicks: clicks + 1
});
});

但这似乎需要某种可变的状态管理器?

或者,我想我可以将点击事件添加到要在更新循环中处理的操作队列中,例如:

window.addEventListener('click', function() {
createAction('click', e);
});

function update(state, actions) {
const newState = {
player,
ticks: state.ticks + 1,
clicks: state.clicks + actions.clicks.length
};

setTimeout(update.bind(this, newState, []), 100);
}

同样,这感觉不是特别实用,并且至少依赖于沿途某个地方的一些可变状态。这些可能是来自主要使用可变状态和命令式面向对象编程的人的幼稚方法。

当存在多个异步事件源并且我们希望所有内容都是不可变的时,系统的设计是什么样的?或者至少,在这样的系统中控制可变性的好模式是什么?

最佳答案

您可能有兴趣查看 Redux 。 Redux 采用了类似的方法:

  • 它将整个应用程序状态建模为单个不可变对象(immutable对象)。
  • 用户操作本质上是发送到存储进行任意处理的消息。
  • 操作由 reducer 函数处理,格式为 f(previousState, action) => newState。这是比原始版本更实用的方法。
  • store 运行 reducer 并维护单个不可变的应用程序状态。

你是对的,这并不是严格不可变的,因为商店本身具有对当前状态的可变引用。但正如其他人所指出的,对于大多数不可变数据的概念来说,这似乎不是一个问题。

除了 UI 操作之外,您还可能有一个循环触发的 tick 操作 - 它只是另一个输入事件,由同一组 reducer 处理。

关于javascript - 异步系统中的不可变数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com