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