是否可以从Observable中删除一个RXJS Observer?

时间:2017-01-18 18:53:00

标签: javascript rxjs

如果我有一个包含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(...)

3 个答案:

答案 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();
});