did*_*ind 4 subject observable rxjs angular
如该线程中所述,通常在Angular 5+中取消订阅Observables的“官方”解决方案是使用takeUntil。到目前为止,一切都很好。我的问题是,如果我订阅的Observable实际上是一个Subject,这是否也适用?
调用.subscribe()任何内容(主题也是如此)之后,需要进行一些操作以确保取消订阅。
处理有限的Observable:如果您订阅有限的Observable(表示具有有限/有限序列的Observable),则最后一条消息将发送结束信号,并且订阅将自动取消。例如:
Observable.of(100)
Observable.from([1,2,3,4])
Run Code Online (Sandbox Code Playgroud)
的实例在有限可观测量是:
Observable.fromEvent(document, 'click')
Observable.timer(1000)
Run Code Online (Sandbox Code Playgroud)
呼叫/管道.first(),.take(number)或.takeWhile(condition that will evaluate to false at some point)或takeUntil(observable that emits a value)上可观察到的将全部变为一个无限否则可观察到有限的。
停止调用.subscribe():另一种不必取消订阅的流行方法是首先不进行订阅。这听起来可能很愚蠢,因为您什么时候想要一个不订阅的观察对象?好吧,如果只需要将一些数据传递到view / html模板,则可在异步管道中观察到的管道会将取消订阅的问题传递给异步管道本身。
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>
Run Code Online (Sandbox Code Playgroud)
手动取消订阅:最后,您可以选择保留对所有订阅的引用。您不必保留指向每个订阅的变量,只使用一个Subscription对象来跟踪所有订阅,然后立即取消订阅所有订阅就容易了。这是一个例子:
const subscriptions = new Subscription();
subscriptions.add(observable1$.subscribe());
subscriptions.add(observable2$.subscribe());
subscriptions.unsubscribe();
Run Code Online (Sandbox Code Playgroud)
快速总结,如何处理退订,可以使用以下任何一种方法:
.takeUntil(this.destroyed$)和this.destroyed$.emit()在中执行ngOnDestroy())的需要。async管道。.unsubscribe()在ngOnDestroy()方法中调用。就我个人而言,我倾向于只使用两种第一方法中的一种。
| 归档时间: |
|
| 查看次数: |
7371 次 |
| 最近记录: |