如何避免函数构造函数中的Rx.Subject但仍允许早期订阅者

时间:2015-02-12 22:25:33

标签: javascript asynchronous mutable rxjs

我正在使用面向对象的JavaScript与rxjs,我正在寻找一个“好的”解决方案/最佳实践,如何初始化一个成员变量,后来应该是一个可观察的序列,在构造函数中。

我现在做的事情:

var myObject = function() {
    this.observableSequence = new Rx.Subject();
};

myObject.prototype.connect = function(somePromise) {
    var self = this;
    somePromise.done(function(anotherSequence) {
        anotherSequence.forEach(function(element) {
            self.observableSequence.onNext(element);
        });
    });
};

在上面的示例中(它按原样工作),我基本上等待外部承诺(由不受我控制的库使用者传递)来解析然后从一个可观察序列开始管道元素到另一个序列。

我认为我在这里做错了,因为代码很多。我使用Rx.Subject的唯一原因是允许其他外部订阅者在完成承诺之前订阅observableSequence。但对于我的API使用者,我希望隐藏.connect()方法的详细信息。消费者只要看到observableSequence会员,就可以随时订阅。

我宁愿有一个没有Rx.Subject的解决方案(因为有人认为不应该使用Rx.Subject,因为它是可变的)并且我也想知道是否有更好的方法来执行'管道'在可观察的序列之间。

1 个答案:

答案 0 :(得分:1)

没有Rx.Subject()的替代方法会在构造函数中完全描述this.observableSequence,但您需要引用未来somePromise,比如proxyToSomePromise。让proxyToSomePromise成为可观察对象是有用的,因此它可用于计算this.observableSequence。基本上我们回到了同样的问题:proxyToSomePromise应该是一个Rx.Subject(),因为somePromise尚不可用。

我看不出你怎么能避免主题。在大多数情况下,您可以使用纯粹的可观察量,但受试者有其用例,它们是必需的。它们也是Cycle.js的核心部分。如果您从外部世界封装主题,即使用asObservable(),它的可变性不是问题。