取消订阅角度中的多个可观察的最佳策略是什么?为了清楚起见,当应用程序不大并且不需要诸如ngrx之类的解决方案时,我使用这种方法,在这种情况下,这种解决方案会过于繁琐。
目前,我使用订阅实例来添加所有订阅,之后当组件被销毁时,我调用取消订阅方法。但我也看到了使用rxjs中的带直到的替代方案。
export class MyComponent implements OnInit, OnDestroy {
$firstObservable: Observable<number> = timer(0, 1000);
$secondObservable: Observable<number> = timer(0, 1000);
private _subscriptions = new Subscription();
constructor() { }
ngOnDestroy(): void {
this._subscriptions .unsubscribe();
}
ngOnInit(): void {
this._subscriptions .add(
this.$firstObservable.subscribe(console.log));
this._subscriptions .add(
this.$secondObservable.subscribe(console.log));
}
}
最好的解决办法是什么?
我建议你使用带直到()
管道运算符:https://www.learnrxjs.io/operators/filtering/takeuntil.html
这样,您可以创建一个主题
,它在ngOnDestroy
上发出值并一次取消订阅多个订阅
unsubscribeSignal: Subject<void> = new Subject();
$firstObservable: Observable<number> = timer(0, 1000);
$secondObservable: Observable<number> = timer(0, 1000);
ngOnInit() {
this.$firstObservable
.pipe(
takeUntil(this.unsubscribeSignal.asObservable()),
)
.subscribe(result => {});
this.$secondObservable
.pipe(
takeUntil(this.unsubscribeSignal.asObservable()),
)
.subscribe(result => {});
}
ngOnDestroy(){
this.unsubscribeSignal.next();
// Don't forget to unsubscribe from subject itself
this.unsubscribeSignal.unsubscribe();
}
我很失望人们甚至没有提到async
管道。
它非常强大,让您无需担心订阅和使用推送检测策略。
要使用它,只需从TS中删除订阅,并将值分配给将被键入为可观察对象的变量。
只看代码精简和简单(不知道是不是单词,但有点不在乎)
export class MyComponent {
firstObservable$: Observable<number> = timer(0, 1000);
secondObservable$: Observable<number> = timer(0, 1000);
combination$ = combineLatest(this.firstObservable$, this.secondObservable$)
.pipe(tap(() => console.log()));
}
用你的超文本标记语言
<ng-container *ngIf="combination$ | async">
Observables are being observed.
</ng-container>
(即使它不适合你的问题示例,你已经可以看到它是如何干净的
最好的部分是,您不必再担心内存泄漏。Angular负责所有订阅,让您只关心您的代码(这是一个好的框架应该做的事情)。
Subscribe
类有一个add
方法,它将多个订阅添加到一个中,然后可以一次取消订阅。
subscription1 = observable.subscribe(
// next, err, complete etc
);
subscription2 = observable.subscribe(
// next, err, complete etc
);
添加多个订阅
subscription1.add(subscription2);
一次取消订阅所有订阅。
subscription1.unsubscribe();