我需要退订吗?
大概吧。
如果你正在设计一个可以完成的主题——即,如果你打算打电话给client.complete()(或client.onCompleted(),如果你使用的是rxjs 4)——那么这将自动取消订阅。
但很多时候,你的行为主体会在一些持续存在的服务中,而你不希望它完成。在这种情况下,您需要取消订阅。您可以通过两种方式取消订阅:
1) 手动:
当你调用 .subscribe 时,你会得到一个订阅对象。如果你在上面调用.unsubscribe()(rxjs 4 中的.dispose()),你将取消订阅。例如:
const subscription = this.clientService.clientStream$
.subscribe(client => this.client = client);
setTimeout(() => subscription.unsubscribe(), 10000); // unsubscribe after 10 seconds
2) 自动,基于另一个 observable。如果您经常在应用程序中使用可观察对象,您可能会发现这种方法非常方便。
Observable 有一个 .takeUntil 运算符,您可以将另一个 observable 传递给它。当第二个 observable 发出一个值时,它将为您取消订阅。这使您可以预先描述哪些条件应该破坏您的 observable。例如:
this.clientService.clientStream$
.takeUntil(Observable.timer(10000))
.subscribe(client => this.client = client);
如果我调用 client.getValue() 会怎样
这将同步为您提供当前值。你根本没有订阅。从好的方面来说,这意味着您无需取消订阅。但不利的一面是,如果您对值何时更改不感兴趣,为什么还要使用行为主题?