Вяза, как модель синхронизируется с подписками? - PullRequest
0 голосов
/ 28 сентября 2018

Когда вы посмотрите на этот отрывок из «Введения Вяза»:

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. передать его в качестве параметра при вызове B из A.

Но только 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, чтобы поддерживать синхронизацию модели между функциями update и subscriptions?

СпасибоLOT!

1 Ответ

0 голосов
/ 01 октября 2018

Это часть того, что мне нравится в elm и как он обходит тот факт, что чистая функция не может иметь побочных эффектов.

Программа elm, запускаемая в браузере, определяет что-то вроде основного:

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

Нигде в своем собственном коде никто не обращается к любой из функций, которые вы передаете в качестве параметров в приведенном выше примере, и все это обрабатывается сгенерированным кодом.

Так что даОднако, как бы вы ни думали об этом, есть где-то представление текущего состояния «модели», которое поддерживается для вас, и его this, которое передается в функцию обновления для генерации next версии.модели и функции представления для создания представления и так далее.Это означает, что вы пишете чистые функции, а что-то еще управляет побочными эффектами.

По большей части вам не следует беспокоиться об этом (о реализации) - это ответственность фреймворка и если он изменится не имеет значения, пока поведение остается неизменным.Тем не менее, сгенерированный код (javascript) доступен для чтения, если вы хотите узнать больше.

...