MiniMongo
リアクティブ ハンドル ( 、など) がリアクティブ計算で作成されると、find()
はそれを検出し、計算が無効化 (または停止) されたときにハンドルを停止するリスナーを計算にアタッチします。observe()
MiniMongo
onInvalidate
これがコールバックで直接行われるかautorun
、コールバック it から呼び出される関数で行われるかは、同期的に (つまり、同じ計算のコンテキスト内で) 行われる限り、問題ではありません。
注目すべき例外が 1 つあります。それは、非反応的なコールバックです。
Tracker.nonreactive
コールバックは非反応コンテキスト内で起動されるため、現在の計算は に設定されnull
、Tracker.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();