AngularJS通过引入包装器服务(例如$timeout和$interval)提供了使用setTimeout和setInternal的便捷方法。我已经使用AngularJS(1.x)多年了,在我看来,人们只有 set-it 和 forget-it 类型的功能。但是,忘记清理计时器可能会导致一些严重的负面后果,从无声的代码一直到通过发出重复的请求而使您的http请求过载。
我很好奇通过滥用$ timeout和$ interval用法而不进行清理会导致哪种严重的副作用?
答案 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
周期很昂贵,尤其是在较大的应用程序中。因此,拥有一个频繁的计时器(应该在适当的时候不被破坏)会导致该应用处理观察者的次数超过了需要的次数。这会导致角度视图的执行速度变慢,并使应用程序延迟。