如
this thread所述,在Angular 5中取消订阅Observables的“官方”解决方案通常是使用takeUntil.到现在为止还挺好.我的问题是,如果我订阅的Observable实际上是一个主题,这是否也适用?
解决方法
@H_403_10@ 一旦你在任何事情上调用.subscribe()(主题也是如此),需要确保订阅被取消订阅.处理有限的Observables:
如果您订阅了有限可观察量(意味着具有有限/有限序列的可观察量),则最后一条消息将发送结束信号,并且订阅将自动取消.
这方面的例子是:
Observable.of(100) Observable.from([1,2,3,4])
无限可观测量的例子是:
Observable.fromEvent(document,'click') Observable.timer(1000)
调用/管道.first(),.take(数字)或.takeWhile(在某些时候将评估为false的条件)或takeUntil(可观察到的值发出一个值)将会将无限的可观察量变为有限的.
停止调用.subscribe():
另一种不必取消订阅的流行方法是首先不订阅.这可能听起来很愚蠢,因为你什么时候想要一个你不订阅的观察者?好吧,如果您只需要将一些数据传递给您的view / html模板,那么将observable传递到异步管道中会将取消订阅问题传递给异步管道本身.
html模板中的典型示例:
<h1>Editing {{ infiniteObservable$| async }}<h1> <li *ngFor="let user of userObservable$| async as users; index as i; first as isFirst"> {{i}}/{{users.length}}. {{user}} <span *ngIf="isFirst">default</span> </li>
手动取消订阅:最后,您可以选择保留对所有订阅的引用.您不必保留指向每个订阅的变量,只需使用单个Subscription对象来跟踪所有订阅,然后立即取消订阅所有订阅.
这是一个例子:
const subscriptions = new Subscription(); subscriptions.add(observable1$.subscribe()); subscriptions.add(observable2$.subscribe()); subscriptions.unsubscribe();
>将无限可观测值转换为有限值,因此无需取消订阅(使用.takeUntil(this.destroyed $)并在ngOnDestroy()中执行this.destroyed $.emit()).
>避免订阅,并通过异步管道传递observable.
>保留对任何订阅的引用,并在ngOnDestroy()方法中调用.unsubscribe().
我个人倾向于只使用两种方法中的一种.