meteor的反应如何在幕后工作?
我已经阅读了文档,并查看了react native的来源 ,但是我不明白。
有人可以解释这是如何在幕后工作,因为它看起来像我的魔力:)。
所以它实际上是相当直接的,在基本层面上有两种types的function:
-
创build反应环境的函数(反应函数)
-
使被动上下文无效的function(无效function)
-
可以做的两个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");
- 自动运行function作为其参数
- 在autorun运行这个函数之前,它会创build一个
context - 自动运行将callback附加到
context的无效事件 - 这个callback将重新运行传递给自动运行的函数
- 然后该函数首次在
context运行。 - meteor将这个
context全局存储为当前活动的context - 函数内部是另一个函数:Session.get()
- Session.get()既是一个
reactive function又是一个invalidating function - Session.get设置它自己的
context并在内部将它与关键的“名称” - Session.get从meteor全局检索当前上下文(自动运行的上下文)
- Session.get向其自身的上下文注册的无效callback将简单地使其封闭上下文(在这种情况下是自动运行的上下文)
- 所以现在我们有两个上下文,autorun's和session.get's
-
当这些函数返回时,meteor清理活动的上下文全局variables
-
Session.set是另一个能够使
context无效的函数。 - 在这种情况下,我们将使由与关键字“name”关联的Session创build的所有
context无效 - 所有这些
contexts无效时都会运行无效callback。 - 这些callback只是使其封闭的
context无效(这是Session.get的devise,而不是无效callback必须做的) - 那些封闭的
contexts现在运行失效callback。 - 在自动运行的情况下,该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