Я прочитал docs и посмотрел на источник реактивность, но я этого не понимаю.
Может кто-нибудь объяснить, как это работает за кулисами, поскольку для меня это выглядит как волшебство:).
Я прочитал docs и посмотрел на источник реактивность, но я этого не понимаю.
Может кто-нибудь объяснить, как это работает за кулисами, поскольку для меня это выглядит как волшебство:).
Итак, это на самом деле довольно прямолинейно, на базовом уровне задействованы 2 типа функций:
Функции, которые создают реактивный контекст (реактивная функция)
Функции, которые недействительны для реактивного контекста (функция недействительности)
Функции, которые могут выполнять оба. (Я соврал там 3)
Когда вы вызываете reactive function
, он создает context
, который хранит метеориты по всему миру и к которому reactive function
подписывается обратный вызов invalidation
. Функция, которую вы передаете реактивной функции или любые функции, которые запускаются внутри нее, может быть invalidating function
и может захватывать текущий context
и сохранять ее локально. Эти функции могут тогда в любой момент, например, при обновлении db или просто вызове таймера, недействительны, что context
. Первоначальный reactive function
затем получит это событие и переоценит себя.
Здесь шаг за шагом, используя функции метеора (обратите внимание, что Tracker.autorun
называлось Deps.autorun
):
Tracker.autorun(function(){
alert("Hello " + Session.get("name"));
});
Session.set("name", "Greg");
context
context
context
в первый раз.context
глобально как текущий активный context
reactive function
, так и invalidating function
context
и связывает его внутри с ключом "имя" когда эти функции возвращаются, метеорит очищает глобальную переменную активного контекста
Session.set - это еще одна функция, которая может привести к недействительности context
.
context
, созданные сеансом, связанным с ключом "имя" contexts
, когда они недействительны, запускают свои обратные вызовы недействительности.context
(что дизайн Session.get, а не то, что должен делать обратный вызов недействительности)contexts
, теперь выполняют свои обратные вызовы недействительности.context
. Вся реализация на самом деле довольно прямолинейна, вы можете увидеть ее здесь:
https://github.com/meteor/meteor/blob/master/packages/tracker/tracker.js
И хороший пример того, как это работает, можно найти здесь:
https://github.com/meteor/meteor/blob/master/packages/reactive-dict/reactive-dict.js
Реактивное программирование на самом деле не является метеорным или JS-специфическим
вы можете прочитать об этом здесь: http://en.wikipedia.org/wiki/Reactive_programming