meteor的反应如何在幕后工作?

我已经阅读了文档,并查看了react native的来源 ,但是我不明白。

有人可以解释这是如何在幕后工作,因为它看起来像我的魔力:)。

所以它实际上是相当直接的,在基本层面上有两种types的function:

  1. 创build反应环境的函数(反应函数)

  2. 使被动上下文无效的function(无效function)

  3. 可以做的两个function。 (我撒谎有3)

当你调用一个reactive function它会创build一个全球stream动存储的context ,并且reactive function订阅一个invalidationcallbackreactive function 。 传递给被动函数的函数或从其中运行的函数可能是invalidating function ,可以抓取当前context并将其存储在本地。 这些函数可以在任何时候,比如数据库更新或简单的定时器调用,使context无效。 原始的reactive function然后将接收该事件并重新评估自己。

这是一个一步一步使用meteor函数(请注意, Tracker.autorun曾经被称为Deps.autorun ):

 Tracker.autorun(function(){ alert("Hello " + Session.get("name")); }); Session.set("name", "Greg"); 
  1. 自动运行function作为其参数
  2. 在autorun运行这个函数之前,它会创build一个context
  3. 自动运行将callback附加到context的无效事件
  4. 这个callback将重新运行传递给自动运行的函数
  5. 然后该函数首次在context运行。
  6. meteor将这个context全局存储为当前活动的context
  7. 函数内部是另一个函数:Session.get()
  8. Session.get()既是一个reactive function又是一个invalidating function
  9. Session.get设置它自己的context并在内部将它与关键的“名称”
  10. Session.get从meteor全局检索当前上下文(自动运行的上下文)
  11. Session.get向其自身的上下文注册的无效callback将简单地使其封闭上下文(在这种情况下是自动运行的上下文)
  12. 所以现在我们有两个上下文,autorun's和session.get's
  13. 当这些函数返回时,meteor清理活动的上下文全局variables

  14. Session.set是另一个能够使context无效的函数。

  15. 在这种情况下,我们将使由与关键字“name”关联的Session创build的所有context无效
  16. 所有这些contexts无效时都会运行无效callback。
  17. 这些callback只是使其封闭的context无效(这是Session.get的devise,而不是无效callback必须做的)
  18. 那些封闭的contexts现在运行失效callback。
  19. 在自动运行的情况下,该callback运行我们最初传递给自动运行的函数,然后再次设置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

反应式编程实际上不是meteor或JS特定的
你可以在这里阅读: http : //en.wikipedia.org/wiki/Reactive_programming