meteor的反应如何在幕后工作?
我已经阅读了文档,并查看了react native的来源 ,但是我不明白。
有人可以解释这是如何在幕后工作,因为它看起来像我的魔力:)。
所以它实际上是相当直接的,在基本层面上有两种types的function:
-
创build反应环境的函数(反应函数)
-
使被动上下文无效的function(无效function)
-
可以做的两个function。 (我撒谎有3)
当你调用一个reactive function
它会创build一个全球stream动存储的context
,并且reactive function
订阅一个invalidation
callbackreactive 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