Elm,模型如何与订阅保持同步?

时间:2018-09-28 16:10:15

标签: javascript functional-programming elm mutation elm-architecture

当您观看“榆树简介”的摘录时:

tree.SelectMany(x=> new List<Node> {x.Left, x.Right}); 

传递给函数subscriptions : Model -> Sub Msg subscriptions model = Time.every 1000 Tick 的{​​{1}}参数必须对应于应用程序的当前模型,即,如果模型的更改时间少于1秒,则将参数model传递给函数subscriptions必须考虑到此修改。

与JS中一样,有3种方法可以使在一个函数model中计算出的变量在另一个subscriptions中可见:

  1. 使其成为全球性的
  2. 使其成为对象属性,
  3. 从A调用B时将其作为参数传递。

但是如果您具有update msg model函数中的异步代码来使模型保持“同步”,则只有2个:

1-将其设为全局变量,然后通过重新分配来更新当前模型的值:

subscriptions model

2-将其设为对象属性

subscriptions

我的问题是,它如何在Elm架构中“在幕后”工作,以保持模型function app() { const currentModel = initModel function update(msg, model) { const newModel = doSomething(msg, model) // REASSIGNMENT currentModel = newModel } function subscriptions() { doSomethingEveryOneSecond(currentModel) } } function app() { const model = initModel function update(msg, model) { // MUTATION model.value = doSomething(msg, model) } // model ALWAYS represents the current model function subscriptions(model) { doSomethingEveryOneSecond(model) } } 之间的同步?

非常感谢!

1 个答案:

答案 0 :(得分:1)

这是我喜欢榆树的一部分,它是如何克服纯函数不会产生副作用的事实的。

要在浏览器中运行的elm程序定义了主要内容,例如:

main =
  Browser.document { init = init, update = update, view = view, subscriptions = subscriptions }

在上面自己的代码中,没有人会调用您作为参数传递的任何函数,这些函数全部由生成的代码处理。

所以是的,但是您想考虑一下,这里有一个表示您正在维护的“模型”当前状态的表示形式,并将其传递给更新函数以生成模型的下一个版本,然后使用view函数生成视图,依此类推。这意味着您编写的是纯函数,而其他方法则可以管理副作用。

在大多数情况下,您不必担心此事(关于实现)-这是框架的责任,并且只要它保持一致,只要行为发生改变,它就无关紧要。 。也就是说,如果您想探索更多内容,可以阅读生成的代码(javascript)。