RXJS – Angular – 取消订阅主题

前端之家收集整理的这篇文章主要介绍了RXJS – Angular – 取消订阅主题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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().

我个人倾向于只使用两种方法中的一种.

猜你在找的Angularjs相关文章