当您观看“榆树简介”的摘录时:
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
中可见:
但是如果您具有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)
}
}
之间的同步?
非常感谢!
答案 0 :(得分:1)
这是我喜欢榆树的一部分,它是如何克服纯函数不会产生副作用的事实的。
要在浏览器中运行的elm程序定义了主要内容,例如:
main =
Browser.document { init = init, update = update, view = view, subscriptions = subscriptions }
在上面自己的代码中,没有人会调用您作为参数传递的任何函数,这些函数全部由生成的代码处理。
所以是的,但是您想考虑一下,这里有一个表示您正在维护的“模型”当前状态的表示形式,并将其传递给更新函数以生成模型的下一个版本,然后使用view函数生成视图,依此类推。这意味着您编写的是纯函数,而其他方法则可以管理副作用。
在大多数情况下,您不必担心此事(关于实现)-这是框架的责任,并且只要它保持一致,只要行为发生改变,它就无关紧要。 。也就是说,如果您想探索更多内容,可以阅读生成的代码(javascript)。