我正在使用Angular2编写实时更新图。我的图表正在通过http
可观察对象和setInterval
命令进行更新。
我注意到的一个奇怪的事情是,当我通过角度路由到我的应用程序上的不同视图时,前一个组件上的setInterval
命令不会停止,从而导致服务器不必要的负载。
在Angular2中阻止路由更改的setInterval
http请求的正确方法是什么?
任何帮助都会受到赞赏。
答案 0 :(得分:5)
Events are managed very differently by browsers,基本上它们由事件循环处理。
浏览器有内循环,称为事件循环,用于检查队列 并处理事件,执行函数等。
因此,每当您添加setTimeout
/ setInterval
等任何异步事件时,都会将其添加到事件循环及其处理程序。
基本上每当你想要stop/de-register
那些异步事件时,你需要手动取消注册它们。与此处一样,您需要使用clearInterval
对象引用调用setInterval
方法,然后只会从async
中删除Event Loop
个事件。
您可以使用ngOnDestroy
生命周期钩子,在破坏组件之前可以使用你的东西。
//hook gets called before Component get destroyed or you can say disposed.
ngOnDestroy(){
clearInterval(intervalReference)
}
额外的东西(与Angular 1比较)
您可以在任何Javascript框架中看到同样的问题。在Angular 1中,有办法处理这种情况(我正在添加这些内容,以便来自Angular 1
背景的任何人都可以通过将A1
与A2
进行比较来轻松获得此概念。同时销毁controller
实例角内部发出的$destroy
事件超过element
&该元素的$scope
。因此,通过监听$destroy
事件,我们过去常常确保那些对象value/object/events
不可用。
$scope.$on('$destroy', function(event){
//do stuff here
})
element.bind('$destroy', function(event){
//do stuff here
})