takeUntil
закроет подписку, когда переданная в нее заметка получит уведомление.
Возьмите этот пример:
private destroyed$ = new Subject();
private sub: Subscription;
ngOnInit() {
this.sub = merge(
this.obs1(),
this.obs2()
).pipe(
takeUntil(this.destroyed$)
).subscribe(result => {
console.log(result);
}, () => {}, () => {
console.log('complete');
});
}
ngOnDestroy() {
// this.sub is still open
console.log(this.sub);
// now close the subscription indirectly
this.destroyed$.next();
this.destroyed$.complete();
// this.sub is now closed
console.log(this.sub);
}
private obs1(): Observable<any> {
return timer(0, 1000).pipe(mapTo('Hello, '));
}
private obs2(): Observable<any> {
return timer(0, 1500).pipe(mapTo('World!'));
}
Пока компонент находится в DOM, две наблюдаемые будет продолжать срабатывать, и подписка на слияние получит значения из timer
наблюдаемых.
Когда компонент удаляется из DOM, ngOnDestroy
срабатывает. Первый console.log(this.sub)
покажет, что подписка открыта. Второй покажет, что он был закрыт.
С консоли:
Object {closed: false, ...}
Object {closed: true, ...}
DEMO: https://stackblitz.com/edit/angular-8c9nkd