我需要取消订阅吗?
很可能需要。
如果你正在设计一个将会完成的主题 - 比如,如果你打算调用client.complete()
(或者使用 rxjs 4 则为client.onCompleted()
)- 那么它会自动停止订阅。
但是通常情况下,你的行为主题将在某个服务中持久存在,你不希望它完成。在这种情况下,你需要取消订阅。你有两种方法可以取消订阅:
1) 手动取消:
当你调用 .subscribe
方法时,你会得到一个订阅对象。如果你在它上面调用 .unsubscribe()
方法(在 rxjs 4 中为 .dispose()
),就会取消订阅。例如:
const subscription = this.clientService.clientStream$
.subscribe(client => this.client = client)
setTimeout(() => subscription.unsubscribe(), 10000)
2) 根据另一个可观察对象自动进行。如果您在应用程序中经常使用可观察对象,您可能会发现这种方法非常方便。
可观察对象具有 .takeUntil
操作符,您可以将另一个可观察对象传递给它。当第二个可观察对象发出值时,它将为您取消订阅。这使您可以事先描述应该终止可观察对象的条件。例如:
this.clientService.clientStream$
.takeUntil(Observable.timer(10000))
.subscribe(client => this.client = client)
如果我调用client.getValue()会发生什么?
这将同步地给您当前的值。您根本没有订阅。好的一面是,这意味着您不需要取消订阅。但是缺点是,如果您对查看值何时更改不感兴趣,那为什么要使用BehaviorSubject?