Как реактивность Метеора работает за кулисами?


прочитал docs и посмотрел на источник реактивности, но я этого не понимаю.

может кто-нибудь объяснить, как это работает за кулисами, как это выглядит как магия :).

1 66

1 ответ:

так это на самом деле довольно прямо вперед, на базовом уровне есть 2 типа функций:

  1. функции, которые создают реактивный контекст (реактивная функция)

  2. функции, которые делают недействительным реактивный контекст (недействительная функция)

  3. функции, которые могут делать и то и другое. (Я соврал, что есть 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");
  1. автозапуск принимает функцию в качестве параметра
  2. перед автозапуском эта функция создает context
  3. автозапуск присоединяет обратный вызов к context событие недействительности
  4. этот обратный вызов повторно запустит функцию, переданную в автозапуск
  5. затем функция запускается в context в первый раз.
  6. Метеор хранит это context во всем мире в настоящее время активный context
  7. внутри функции находится другая функция: сессия.получить()
  8. сессии.get () - это оба a reactive function и invalidating function
  9. сессии.получить настройки это собственный context и связывает его внутренне с ключом "name"
  10. сессии.get извлекает текущий контекст (контекст автозапуска) глобально из meteor
  11. обратный вызов недействительности этого сеанса.получить регистры в свой собственный контекст, просто аннулирует его заключительный контекст (в данном случае контекст автозапуска)
  12. Итак, теперь у нас есть 2 контекста, автозапуск и сеанс.сделать это
  13. когда эти функции возвращаются, meteor очищает активную глобальную переменную контекста

  14. сессии.набор другая функция способна недействительности context.

  15. в этом случае мы аннулируем все contexts создается сеансом, связанным с ключом "name"
  16. все эти contexts, когда они недействительны, запустите их обратные вызовы недействительности.
  17. эти обратные вызовы просто аннулируют их включение contexts (это дизайн сессии.получить, а не то, что должен сделать обратный вызов недействительности)
  18. те, что окружают contexts теперь запустите их обратные вызовы недействительными.
  19. в случае автозапуска этот обратный вызов запускает функцию, которую мы первоначально передали в автозапуск, а затем устанавливает 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