跟踪器:为什么在失效时删除计算?

时间:2015-07-16 12:06:34

标签: javascript meteor meteor-tracker

我正在阅读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()回调来从依赖项中删除计算?对我来说似乎没必要。

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

1 个答案:

答案 0 :(得分:0)

请考虑一下这个Tracker.autorun功能:

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

非常简单,只要dependency2高于10,它就会记录每次dependency1更改。现在,如果计算中dependency1低于11,它将会只依靠它。如果计算在dependency1大于10时运行,则它将取决于两个依赖项。

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