tl; dr: В принципе, я хочу жениться на Angular ngOnDestroy
с помощью оператора Rxjs takeUntil()
. - возможно ли это?
У меня есть компонент Angular, который открывает несколько подписей Rxjs. Они должны быть закрыты при уничтожении компонента.
Простым решением для этого было бы:
class myComponent {
private subscriptionA;
private subscriptionB;
private subscriptionC;
constructor(
private serviceA: ServiceA,
private serviceB: ServiceB,
private serviceC: ServiceC) {}
ngOnInit() {
this.subscriptionA = this.serviceA.subscribe(...);
this.subscriptionB = this.serviceB.subscribe(...);
this.subscriptionC = this.serviceC.subscribe(...);
}
ngOnDestroy() {
this.subscriptionA.unsubscribe();
this.subscriptionB.unsubscribe();
this.subscriptionC.unsubscribe();
}
}
Это работает, но это немного избыточно. Мне особенно не нравится, что
- unsubscribe()
находится где-то в другом месте, поэтому вы должны помнить, что они связаны.
- Состояние компонента загрязнено подпиской.
Я бы предпочел использовать оператор takeUntil()
или что-то подобное, чтобы он выглядел следующим образом:
class myComponent {
constructor(
private serviceA: ServiceA,
private serviceB: ServiceB,
private serviceC: ServiceC) {}
ngOnInit() {
const destroy = Observable.fromEvent(???).first();
this.subscriptionA = this.serviceA.subscribe(...).takeUntil(destroy);
this.subscriptionB = this.serviceB.subscribe(...).takeUntil(destroy);
this.subscriptionC = this.serviceC.subscribe(...).takeUntil(destroy);
}
}
Есть ли событие destroy или что-то подобное, что позволило бы мне использовать takeUntil()
или другой способ упростить архитектуру компонента?
Я понимаю, что могу создать событие самостоятельно в конструкторе или что-то, что срабатывает внутри ngOnDestroy()
, но это, в конце концов, не сделает вещи, которые намного проще читать.