【问题标题】:Are stop-returning functions still stopped when inside nested functions?在嵌套函数内部时,停止返回函数是否​​仍然停止?
【发布时间】:2016-03-13 18:00:02
【问题描述】:

此外,以下函数返回一个对象 stop 方法,如果从响应式计算中调用,则在以下情况下停止 重新运行或停止计算:

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

这意味着观察到此停止:

Tracker.autorun ->
  cursor.observe()

但是这里呢?

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

【问题讨论】:

  • 它不仅仅是一个嵌套函数,它是一个nonreactive 上下文,因此在其中的观察不会自动停止。

标签: meteor meteor-tracker


【解决方案1】:

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

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

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

Tracker.nonreactive 回调在非响应式上下文中触发,因此 current computation 设置为 null 并且 Tracker.active 设置为 false。在这种情况下,MiniMongowill 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();

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2015-01-16
    • 1970-01-01
    • 2018-06-04
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多