如何在RX主题上定义运算符?

时间:2016-01-27 14:16:52

标签: javascript rxjs

如何在RX主题上定义运算符?我希望能够在不更改原始源流的情况下限制/获取/去抖数据流。香港专业教育学院尝试了以下(破碎)实施。任何帮助表示感谢。

var source = Rx.Observable.interval(1000).take(10);

var subject = new Rx.Subject();
source.subscribe(subject);

var subscriber1 = subject.subscribe(
    function (x) { $("#result1").append('next: ' + x + '<br>'); },
    function (e) { $("#result1").append('onError: ' + e.message); },
    function () { $("#result1").append('onCompleted'); });

var modified = new Rx.Subject().take(2); // ... or throttle, or debounce etc

source.subscribe(modified);

var subscriber2 = modified.subscribe(
    function (x) { $("#result2").append('next: ' + x + '<br>'); },
    function (e) { $("#result2").append('onError: ' + e.message); },
    function () { $("#result2").append('onCompleted'); });

1 个答案:

答案 0 :(得分:1)

您可以查看What are the semantics of different RxJS subjects?以获取有关主题的一些额外信息。

主题是可观察的,因此您可以使用与可观察对象相同的运算符。主题是观察者,因此您可以订阅他们的来源。

代码中出现的问题是以下var modified = new Rx.Subject().take(2); source.subscribe(modified);

modified不再是主题,它只是一个常规的可观察对象,所以你不能订阅它来源,你只能订阅一个观察者来源。

做类似的事情:

var newS = new Rx.Subject();
source.subscribe(newS);

var subscriber2 = newS.take(2).subscribe(
    function (x) { $("#result2").append('next: ' + x + '<br>'); },
    function (e) { $("#result2").append('onError: ' + e.message); },
    function () { $("#result2").append('onCompleted'); });