2012-04-21 65 views

回答

99

所以它實際上是相當簡單的,在基本層面上有涉及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. 自動運行運行此功能之前,它創建a context
  3. autorun將回調附加到context的失效事件
  4. 此回調將重新運行傳遞給自動運行的函數
  5. 函數然後首次在context中運行。
  6. 流星存儲該全局context作爲當前激活的context
  7. 該函數內部有另一個功能:Session.get()
  8. Session.get()既是一種reactive functioninvalidating function
  9. Session.get套多達它自己的context和同事在內部與來自全球的流星
  10. 的無效回調Session.get註冊到我的鑰匙「名」
  11. Session.get檢索當前上下文(自動運行的情況下) T公司自己的情況下,將簡單地無效它的封閉環境(在這種情況下,自動運行的情況下)
  12. 所以現在我們有2個上下文,自動運行的和session.get的
  13. 當這些函數返回,流星清理活動上下文全局變量

  14. Session。設置是另一個功能,可以使context無效。

    在這種情況下
  15. 我們通過無效會話創建的所有context 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

+0

很酷的感謝這個好解釋 – 2012-11-07 12:50:26

+5

很好的解釋這應該是在流星頁面。 – alejandro 2012-11-08 19:24:15

+1

這個視頻是非常有幫助的http://www.eventedmind.com/posts/meteor-reactivity-with-contexts – jonperl 2013-01-29 16:05:37