【问题标题】:Tracker: why remove computation when invalidated?Tracker:为什么在无效时删除计算?
【发布时间】:2015-07-16 12:06:34
【问题描述】:

我正在阅读tracker manual 并且很难理解某些内容。

我了解dependency.changed() 将使依赖项中的所有计算无效,从而导致跟踪器重新运行。

但是为什么 Meteor 在失效时会从依赖中删除计算呢?

例如,这是手册中的 Tracker 示例:

Dependency.prototype.depend = function () {
  var self = this;
  if (Tracker.currentComputation) {
    var id = self._nextId++;
    self._dependents[id] = Tracker.currentComputation;
    Tracker.currentComputation.onInvalidate(function () { # Here
      delete self._dependents[id];                        # Here
    });                                                   # Here
  }
};

Dependency.prototype.changed = function () {
  for (var id in this._dependents) {
    this._dependents[id].invalidate();
  }
};

为什么我们要添加Tracker.currentComputation.onInvalidate() 回调来从依赖项中删除计算?对我来说似乎没有必要。

我想完全理解这一点。有什么想法吗?

【问题讨论】:

  • 我认为使计算无效会导致它重新运行,因此它很可能会再次注册依赖项。在某些情况下可能不会,在这种情况下,出于性能原因,我们希望清除依赖项。

标签: javascript meteor meteor-tracker


【解决方案1】:

请考虑一下这个 Tracker.autorun 函数:

Tracker.autorun(()=>{
    if(dependency1.get()>10){
        console.log(dependency2.get());
    }
});

这很简单,只要dependency1 大于10,它就会记录每个dependency2 的变化。现在,如果在计算中dependency1 小于11,它只会依赖它。而如果计算在dependency1 大于 10 时运行,它将取决于两个依赖项。

如果您不删除依赖项并且 dependency1 等于或低于 10,则每次 dependency2 更改时跟踪器仍将运行,尽管不会发生任何事情。这可能会成为大型自动运行的真正性能问题。

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 2022-12-09
    • 2020-01-09
    • 1970-01-01
    • 2012-07-26
    • 2011-05-27
    • 2019-08-13
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多