Meteor的反应性如何在幕后工作?

dua*_*ty_ 66 meteor

我已阅读文档并查看了反应性背后来源,但我不明白.

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

gre*_*reg 99

所以它实际上相当直接,在基本层面上涉及两种类型的函数:

  1. 创建反应上下文的函数(反应函数)

  2. 使响应上下文无效的函数(使函数无效)

  3. 可以兼顾两者的功能.(我谎称有3个)

当你调用reactive function它时,它会在context全局创建一个meteor存储,并为其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");
Run Code Online (Sandbox Code Playgroud)
  1. autorun将函数作为其参数
  2. 在自动运行之前运行此功能,它会创建一个 context
  3. autorun将回调附加到context失效事件
  4. 此回调将重新运行传递给autorun的函数
  5. 然后该函数context首次在该函数中运行.
  6. Meteor将其context作为当前活动的全球存储context
  7. 函数内部是另一个函数:Session.get()
  8. Session.get()既是a reactive function又是ainvalidating function
  9. Session.get设置它自己context并将其内部与键"name"关联
  10. Session.get从meteor全局检索当前上下文(autorun的上下文)
  11. Session.get注册到它自己的上下文的失效回调将使它的封闭上下文无效(在这种情况下,autorun的上下文)
  12. 所以现在我们有2个上下文,autorun和session.get
  13. 当这些函数返回时,meteor会清除活动的上下文全局变量

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

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

  • 这应该在流星页面中得到很好的解释. (5认同)
  • "autosubscribe中的撇号需要一个函数**它的**参数"真的不应该存在! (3认同)