你对Angular很新。我有大约4个数据库查询,每个查询都是options.ondragover = options.ondragover || noop;
。所以我知道我需要取消订阅每个订阅以节省内存泄漏。我该如何优化通话?我的意思是,我不想打电话给每个订阅并逐个取消订阅。我想在一次通话中取消订阅。对不起,如果这是一个愚蠢的问题。伙计们好吗?提前致谢
答案 0 :(得分:5)
subscriptions = Subscription[];
someMethod() {
this.subscriptions.push(http.get(...).map(...).subscribe(...));
}
ngOnDestroy() {
this.subscriptions.forEach(s => s.unsubscribe());
}
当观察完成时,取消订阅是多余的。只有在不完成事件的情况下继续发出事件的观察者才需要取消订阅。
如果您只想接收单个(或其他有限数量的事件),您可以通过使用take(x)
之类的运算符来控制您订阅的observable何时完成,然后在x
个事件之后可观察到将完成。
答案 1 :(得分:0)
还有另一种有趣的方法:
@Component({ ... })
export class SomeComponent implements OnInit, OnDestroy {
private componentDestroyed$ = new Subject();
...
ngOnInit() {
this.yourObs1$.takeUntil(componentDestroyed$).subscribe(...);
this.yourObs2$.takeUntil(componentDestroyed$).subscribe(...);
this.yourObs3$.takeUntil(componentDestroyed$).subscribe(...);
...
this.yourObsX$.takeUntil(componentDestroyed$).subscribe(...);
}
ngOnDestroy() {
this.componentDestroyed$.next();
this.componentDestroyed$.complete();
}
}
在这里,您甚至不需要跟踪订阅,而且您阅读的方式更加开发友好(我认为)。
Ben Lesh在http://www.jeasyui.com/easyui/demo/demo.css上解释了它,我喜欢这种取消订阅的方式!
答案 2 :(得分:0)
export class BaseComponent implements OnDestroy {
protected alive$: Subject<void> = new Subject<void>();
ngOnDestroy(): void {
// console.log("unsubscribing base component");
this.alive$.next();
this.alive$.complete();
}
}
export class EveryComponent extends BaseComponent {
this.AllObs1$.takeUntil(this.alive$).subscribe(...);
}