如果我有一个包含Observable的服务,我有以下代码......
this.collapse.newChild.subscribe(name => {
if (name === "helpArea") {
this.collapse.process("helpArea", true);
}
// I would like to detach now
});
是否可以在不取消原始订阅的情况下分离?如果我致电unsubscribe
,那么当我致电this.collapse.newChild.next("thing")
时,会引发错误Error: object unsubscribed
。
所以我不认为取消订阅是我正在寻找的,那么有没有办法分离一个观察者?
现在我正在使用......
this.collapse.newChild.map(name => name === "helpArea").first().subscribe(...)
答案 0 :(得分:1)
我不认为你的"解决方法"一点都不好。它甚至似乎是惯用的:Rx 希望你这样做的方式。但是你可以使用first
的形式将它写得更短一些,它采用谓词。
this.collapse.newChild
.first(name => name === "helpArea")
.subscribe(...);
一般而言,使用Rx的思维方式是尽可能使用组合器来操作流以准确生成所需的值,然后使用简单的处理程序进行订阅,该处理程序应用最终的,有效的步骤:更新用户界面,调用服务等。这将使代码更清晰,更具表现力,更容易阅读,更容易重复使用。
对于您的示例,此方法的另一个好处是无需取消订阅。 RX会在第一个值之后为你做这个,因为它知道不会有更多。所以它比自己做得更干净。
答案 1 :(得分:1)
彼得的答案在设计/练习PoV中是正确的,但请注意,由于unsubscribe
主题,您会收到此错误。
您要停止的是订阅:
var subscription = this.collapse.newChild.subscribe(...)
// NOT this
// this.collapse.newChild.unsubscribe()
// this
subscription.unsuscribe()
这将杀死/停止主题,但仅限于您当前的订阅。
答案 2 :(得分:0)
在Subscription对象上调用unsubscribe()
只取消订阅此特定观察者。所以一个问题是你是如何在第一时间取消订阅的,因为使用first()
会发送导致取消订阅的完整通知。
var subscription = this.collapse.newChild.subscribe(name => {
if (name === "helpArea") {
this.collapse.process("helpArea", true);
}
subscription.unsubscribe();
});