加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

RXJS – Angular – 取消订阅主题

发布时间:2020-12-17 17:34:31 所属栏目:安全 来源:网络整理
导读:如 this thread所述,在Angular 5中取消订阅Observables的“官方”解决方案通常是使用takeUntil.到现在为止还挺好.我的问题是,如果我订阅的Observable实际上是一个主题,这是否也适用? 解决方法 一旦你在任何事情上调用.subscribe()(主题也是如此),需要确保订
如 this thread所述,在Angular 5中取消订阅Observables的“官方”解决方案通常是使用takeUntil.到现在为止还挺好.我的问题是,如果我订阅的Observable实际上是一个主题,这是否也适用?

解决方法

一旦你在任何事情上调用.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().

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读