【问题标题】:Elm, how is the model kept synchronised with the subscriptions?Elm,模型如何与订阅保持同步?
【发布时间】:2018-09-28 16:10:14
【问题描述】:

当你看到这段“榆树介绍”的节选时:

subscriptions : Model -> Sub Msg
subscriptions model =
  Time.every 1000 Tick

传递给函数subscriptionsmodel参数必须与应用程序的当前模型相对应,即如果模型在不到1秒的时间内发生变化,则传递给函数subscriptions的参数model必须已考虑到此修改。

在 JS 中,有 3 种不同的方法可以使在一个函数 update msg model 中计算的变量在另一个 subscriptions model 中可见:

  1. 使其成为全球性的,
  2. 使其成为对象属性,
  3. 从 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 架构的“幕后”工作以保持 updatesubscriptions 函数之间的模型同步?

非常感谢!

【问题讨论】:

  • 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


【解决方案1】:

这是我喜欢 elm 的部分原因,以及它如何绕过纯函数不能产生副作用的事实。

在浏览器中运行的 elm 程序定义了一个 main 类似的东西:

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

在你自己的代码中没有任何地方调用你在上面作为参数传递的任何函数,这一切都由生成的代码处理。

所以是的,但是您想考虑一下,在某处代表正在为您维护的“模型”的当前状态,并将其传递给更新函数以生成 下一个版本的模型和视图函数生成视图等等。这意味着您编写纯函数,而其他东西可以管理副作用。

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

【讨论】:

  • 需要强调的是,“模型的当前状态”正是你之前的更新函数产生的。它只传递给下一次更新调用,没有太多的“维护”。特别是,它不会在您的更新方法之外以任何方式更改,也没有任何“作用于它”。
猜你喜欢
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2016-04-08
  • 2015-01-12
相关资源
最近更新 更多