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);
}
}
是否有一个销毁事件或类似的东西,可以让我使用 takeUntil()
或其他简化组件架构的方式?我意识到我可以在构造函数中自己创建一个事件,或者在 ngOnDestroy()
中触发一个事件,但最终这并没有使阅读更加简单。
destroyed$
)并从ngOnDestroy
触发它。但是经过更多的查看后,我意识到没有语法糖可以避免这个问题。尽管如此,这绝对已经是一个比存储所有订阅更好的解决方案了。谢谢! - mariusnew ReplaySubject(1)
。这样你的组件将保持在销毁状态,并确保所有内容都已完成。除此之外,回答得很好 :) - DorusreplaySubject
会帮助组件在ngOnDestroy
已经被调用后,保持在一个已销毁的状态。任何延迟订阅都将立即从replaySubject
中触发重放值并完成。请注意,这里的翻译只是为了让内容更加通俗易懂,并未改变原意。 - Dorus