Вязов, как модель синхронизируется с подписками?

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

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 функции?

Большое спасибо!

1 ответ

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

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

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

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

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

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

Другие вопросы по тегам