对AngularJS(1.x)中的$ timeout和$ interval的警告

时间:2018-06-23 09:15:57

标签: angularjs timeout setinterval intervals angularjs-service

AngularJS通过引入包装器服务(例如$timeout$interval)提供了使用setTimeout和setInternal的便捷方法。我已经使用AngularJS(1.x)多年了,在我看来,人们只有 set-it forget-it 类型的功能。但是,忘记清理计时器可能会导致一些严重的负面后果,从无声的代码一直到通过发出重复的请求而使您的http请求过载。

我很好奇通过滥用$ timeout和$ interval用法而不进行清理会导致哪种严重的副作用?

1 个答案:

答案 0 :(得分:0)

宽松的计时器会造成2个主要的严重副作用。一个是特定于AngularJS的,另一个是任何类型的应用程序(尤其是GC应用程序)中任何“被遗忘的”计时器的一般副作用。

内存泄漏

这是所有GC语言中被遗忘的计时器的常见副作用。如果您忘记了计时器而又认为,则销毁了它周围的范围(即未引用该对象),即使它保留在计时器中,它仍然保留着。例如:

const anObject = {
  fn: () => {
    console.log("I'm alive")
  }
};

setInterval(anObject.fn, 1000)

anObject.fn = null;

即使看起来该函数已被删除(并且我们也无法再使用它),它仍将保留在堆中,因为它仍在setInterval内部引用。

过多的$digest个周期

AngularJS的计时器具有常规计时器没有的特殊行为-它们调用$digest周期。通常这是一件好事,否则,如果您在计时器内进行更改,则不会在控制器和模板中看到数据更新“传播”。

但是,$digest周期很昂贵,尤其是在较大的应用程序中。因此,拥有一个频繁的计时器(应该在适当的时候不被破坏)会导致该应用处理观察者的次数超过了需要的次数。这会导致角度视图的执行速度变慢,并使应用程序延迟。