在嵌套函数内部,停止返回函数是否​​仍然停止?

时间:2016-03-13 03:47:38

标签: meteor meteor-tracker

  

另外,以下函数返回一个带有的对象   stop方法,如果从反应计算中调用,则在停止时停止   计算重新运行或停止:

     

Tracker.autorun(嵌套)Meteor.subscribe observe()和   游标上的observeChanges()

这意味着观察在此处停止:

Tracker.autorun ->
  cursor.observe()

但是这里呢?

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

1 个答案:

答案 0 :(得分:2)

当在反应计算中创建MiniMongo被动句柄(find()observe()等)时,MiniMongo将检测到它并将侦听器附加到计算的onInvalidate将在计算失效(或停止)时停止处理。

这是否直接在autorun回调中完成并不重要 或者在从回调中调用的函数中,只要它是同步完成的(即,在同一计算的上下文中)。

有一个值得注意的例外:非反应性回调。

在非反应式上下文中触发Tracker.nonreactive回调,因此current computation设置为nullTracker.active设置为false。在这些情况下,MiniMongo will not attach the aforementioned listener和更改观察者不会自动停止。

你可以手动停止它:

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();