【发布时间】:2017-12-10 09:08:38
【问题描述】:
我需要每隔一段时间刷新一个组件页面中的数据。此外,我需要在执行一些操作后刷新数据。我在服务中使用 Observables,以便在响应准备好时订阅。我正在将订阅推送到一个对象,以便我可以在ngDestroy 上清除这一点,我认为,我有以下方法可以实现相同的目标。
方法一:设置间隔
我在ngOnInit 上设置了一个间隔,它将以相等的间隔调用 refreshData。间隔对象将在ngOnDestroy 方法中使用clearInterval 清除。
export class MyComponent implements OnInit, OnDestroy {
private subscription: Subscription = new Subscription();
data: any;
interval: any;
ngOnInit() {
this.refreshData();
this.interval = setInterval(() => {
this.refreshData();
}, 5000);
}
ngOnDestroy() {
this.subscription.unsubscribe();
clearInterval(this.interval);
}
refreshData(){
this.subscription.add(
this.myService.getData()
.subscribe(data => {
this.data = data;
})
);
}
doAction(){
this.subscription.add(
this.myService.doAction()
.subscribe(result => {
if(result === true){
this.refreshData();
}
})
);
}
}
Q1:在每次刷新调用时,都会将订阅添加到subscription 对象,这是否会增加内存使用量并且如果用户保持页面打开一段时间可能会导致浏览器崩溃?
方法2:Observable.timer
此方法使用一个计时器,该计时器将在数据刷新后创建。
export class MyComponent implements OnInit, OnDestroy {
private subscription: Subscription = new Subscription();
data: any;
ngOnInit() {
this.refreshData();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
refreshData(){
this.subscription.add(
this.myService.getData()
.subscribe(data => {
this.data = data;
this.subscribeToData();
})
);
}
subscribeToData(){
this.subscription.add(
Observable.timer(10000).subscribe(() => this.refreshData())
);
}
doAction(){
this.subscription.add(
this.myService.doAction()
.subscribe(result => {
if(result === true){
this.refreshData();
}
})
);
}
}
Q2:我在这里有同样的问题(Q1)。这样一来,也会将定时器添加到订阅对象中,因此实际上订阅对象中的订阅量会增加一倍。
Q3:要在操作方法 doAction() 之后刷新数据,调用 refreshData。那么这会创建另一个计时器链吗?
Q4:没有内存泄漏或是否存在任何其他方式,哪种方式更好?
【问题讨论】:
标签: angular memory-leaks setinterval angular2-observables subscriptions