【发布时间】:2018-09-28 16:10:14
【问题描述】:
当你看到这段“榆树介绍”的节选时:
subscriptions : Model -> Sub Msg
subscriptions model =
Time.every 1000 Tick
传递给函数subscriptions的model参数必须与应用程序的当前模型相对应,即如果模型在不到1秒的时间内发生变化,则传递给函数subscriptions的参数model必须已考虑到此修改。
在 JS 中,有 3 种不同的方法可以使在一个函数 update msg model 中计算的变量在另一个 subscriptions model 中可见:
- 使其成为全球性的,
- 使其成为对象属性,
- 从 A 调用 B 时将其作为参数传递。
但只有 2 个,如果你有像函数 subscriptions 那样的异步代码来保持你的模型'同步':
1- 使其成为全局变量,然后通过重新赋值,更新当前模型的值:
function app() {
const currentModel = initModel
function update(msg, model) {
const newModel = doSomething(msg, model)
// REASSIGNMENT
currentModel = newModel
}
function subscriptions() {
doSomethingEveryOneSecond(currentModel)
}
}
2- 使其成为对象属性
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)
}
}
我的问题是,它是如何在 Elm 架构的“幕后”工作以保持 update 和 subscriptions 函数之间的模型同步?
非常感谢!
【问题讨论】:
-
Afaik 每次订阅触发时,都会在模型上调用
update函数,然后计算新的subscriptions,这将触发下一个事件。没有“总是引用当前模型对象的魔法model变量”。 -
对不起,我不太明白。您的意思是每次调用
update函数时,也会调用subscriptions函数并将更新的模型传递给它? -
是的,如果我没记错的话。
-
假设您每 10 秒在
subscriptions中触发一个 HTTP GET 请求(您想跟上世界人口的最新情况 :-)。您发出请求但没有得到响应,此时模型发生了变化:您刚刚更改了网站的背景颜色(原文如此)如果没有,HTTP GET 请求的回调如何知道该修改magic model variable总是指当前模型对象?使用新模型调用subscriptions函数没有帮助... -
您不会在订阅中“每 10 秒触发一次 HTTP GET 请求”。您可以订阅一个计时器,它会通过向您发送消息每十秒“唤醒您”一次。然后,您可以让您的“更新”函数生成一个启动 HTTP 请求的“Cmd”(结果将在另一条消息中返回)。所以也没有“回调”,只是发送消息流进行更新。
标签: javascript functional-programming elm mutation elm-architecture