Angular2 - 在路由更改时停止'setInterval'http请求

时间:2016-04-03 14:37:23

标签: asynchronous angular setinterval observable angular2-routing

我正在使用Angular2编写实时更新图。我的图表正在通过http可观察对象和setInterval命令进行更新。

我注意到的一个奇怪的事情是,当我通过角度路由到我的应用程序上的不同视图时,前一个组件上的setInterval命令不会停止,从而导致服务器不必要的负载。

在Angular2中阻止路由更改的setInterval http请求的正确方法是什么?

任何帮助都会受到赞赏。

1 个答案:

答案 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背景的任何人都可以通过将A1A2进行比较来轻松获得此概念。同时销毁controller实例角内部发出的$destroy事件超过element&该元素的$scope。因此,通过监听$destroy事件,我们过去常常确保那些对象value/object/events不可用。

$scope.$on('$destroy', function(event){
   //do stuff here
})

element.bind('$destroy', function(event){
   //do stuff here
})