Вязов, как модель синхронизируется с подписками?
Когда вы посмотрите на этот отрывок из "Введения вяза":
subscriptions : Model -> Sub Msg
subscriptions model =
Time.every 1000 Tick
model
параметр передан функции subscriptions
должен соответствовать текущей модели приложения, т. е. если модель изменилась менее чем за 1 секунду, аргумент model
перешел в функцию subscriptions
должен был принять во внимание эту модификацию.
Как и в JS, есть 3 разных способа сделать переменную, вычисляемую в одной функции update msg model
виден в другом subscriptions model
:
- сделать это глобальным,
- сделать это свойство объекта,
- передать его в качестве параметра при вызове 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) предназначен для чтения, если вы хотите узнать больше.