0

さらに、停止メソッドでオブジェクトを返す次の関数は、リアクティブ計算から呼び出された場合、計算が再実行または停止されると停止します:

カーソルの Tracker.autorun (ネストされた) Meteor.subscribe observe() および observeChanges()

これは、監視がここで停止することを意味します。

Tracker.autorun ->
  cursor.observe()

しかし、ここはどうですか?

Tracker.autorun ->
  Tracker.nonReactive ->
    cursor.observe()
4

1 に答える 1

2

MiniMongoリアクティブ ハンドル ( 、など) がリアクティブ計算で作成されると、find()はそれを検出し、計算が無効化 (または停止) されたときにハンドルを停止するリスナーを計算にアタッチします。observe()MiniMongoonInvalidate

これがコールバックで直接行われるかautorun、コールバック it から呼び出される関数で行われるかは、同期的に (つまり、同じ計算のコンテキスト内で) 行われる限り、問題ではありません。

注目すべき例外が 1 つあります。それは、非反応的なコールバックです。

Tracker.nonreactiveコールバックは非反応コンテキスト内で起動されるため、現在の計算は に設定されnullTracker.activeに設定されfalseます。これらの条件下でMiniMongo は、前述のリスナーはアタッチされず、変更オブザーバーは自動的に停止されません。

ただし、手動で停止できます。

const MyCollection = new Mongo.Collection(null);
const cursor1 = MyCollection.find({foo: 'bar'});
const cursor2 = MyCollection.find({foo: 'baz'});

let observeCallback = {
  added(doc) {
    console.log('added', doc);
  }
};


let handle = Tracker.autorun(function(c) { // c is the computation object
  cursor1.observe(observeCallback); // will be automatically stopped

  Tracker.nonreactive(function() {
    let observer = cursor2.observe(observeCallback);
    c.onStop(function() {
      observer.stop(); // explicitly stops the observer
    })

  });

});

MyCollection.insert({foo: 'bar'});
MyCollection.insert({foo: 'baz'});

handle.stop();
于 2016-03-13T10:00:02.493 に答える