2

当您查看“榆树介绍”的摘录时:

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

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

在 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)
  }
}

我的问题是它是如何在 The Elm Architecture 的“幕后”工作以保持模型updatesubscriptions函数之间的同步?

多谢!

4

1 回答 1

1

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

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

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

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

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

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

于 2018-10-01T10:47:50.547 回答