web-dev-qa-db-ja.com

Meteorの反応はどのように舞台裏で機能しますか?

私は docs を読んで 反応性の背後にあるソース を見ましたが、それは理解できません。

それが私には魔法のように見えるので、誰かがこれが舞台裏でどのように機能するか説明できますか?.

66
duality_

したがって、実際にはかなり単純です。基本的なレベルでは、2種類の関数が関係しています。

  1. リアクティブコンテキストを作成する関数(リアクティブ関数)

  2. リアクティブコンテキストを無効にする関数(無効化関数)

  3. 両方を実行できる関数。 (うそつき3つあります)

reactive functionを呼び出すと、Meteorがグローバルに保存し、reactive functioncontextコールバックをサブスクライブするinvalidationが作成されます。リアクティブ関数、またはその関数から実行される関数に渡す関数は、invalidating functionにすることができ、現在のcontextを取得してローカルに保存できます。これらの関数は、dbの更新や単にタイマーの呼び出しのように、いつでもそのcontextを無効にすることができます。その後、元のreactive functionはそのイベントを受け取り、自分自身を再評価します。

次に、流星関数を使用した段階的な手順を示します(以前はTracker.autorunDeps.autorunと呼ばれていたことに注意してください)。

Tracker.autorun(function(){ 
  alert("Hello " + Session.get("name"));
});

Session.set("name", "Greg");
  1. autorunは関数をパラメーターとして受け取ります
  2. 自動実行がこの関数を実行する前に、contextを作成します
  3. autorunは、contextの無効化イベントにコールバックをアタッチします
  4. このコールバックは、自動実行に渡された関数を再実行します
  5. その後、関数はcontextで初めて実行されます。
  6. Meteorはこのcontextを現在アクティブなcontextとしてグローバルに保存します
  7. 関数内には別の関数があります。Session.get()
  8. Session.get()はreactive functioninvalidating functionの両方です
  9. Session.getは独自のcontextを設定し、内部的にキー「名前」に関連付けます
  10. Session.getは現在のコンテキスト(自動実行のコンテキスト)を流星からグローバルに取得します
  11. Session.getが自身のコンテキストに登録する無効化コールバックは、それを囲んでいるコンテキスト(この場合は、自動実行のコンテキスト)を無効にするだけです。
  12. これで、autorunとsession.getの2つのコンテキストができました。
  13. これらの関数が戻ると、meteorはアクティブなコンテキストグローバル変数をクリーンアップします

  14. Session.setは、contextを無効化できる別の関数です。

  15. この場合、キー「名前」に関連付けられたセッションによって作成されたすべてのcontextsを無効にします
  16. これらのcontextsはすべて、無効化されると、無効化コールバックを実行します。
  17. これらのコールバックは、囲んでいるcontextsを無効にするだけです(これは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

99
greggreg