操作RxJS流并发布结果的Observable的正确方法是什么?

时间:2016-02-25 05:15:25

标签: javascript rxjs

我有一个websocket连接,它使用ReplaySubect生成内部消息事件。我处理这些事件并为某些消息添加延迟。在内部我使用了publish()。refCount()两次,一次在内部ReplaySubject上,再次在已发布的输出流上。

内部主题是否同时调用了'publish'和'refCount'?我使用'发布'是因为我有多个订阅者,但我不完全确定何时使用'refCount'。

处理内部主题是否可以?那会清理其他一切吗?

订阅'eventStream'的人应该获得最新版本,但连接不应等待任何订阅者

示例代码:

function Connection(...) {

    var messageSubject = new Rx.ReplaySubject(1);
    var messageStream = messageSubject.publish().refCount();


    // please ignore that we're not using rxdom's websocket.
    var ws = new WebSocket(...);
    ws.onmessage = function(messageEvent) {
      var message = JSON.parse(messageEvent.data);
      messageSubject.onNext(message);
    }
    ws.onclose = function(closeEvent) {
      messageSubject.dispose();  // is this all I need to dispose?
    }


    var immediateRevisions = messageStream
        .filter((e) => e[0] === "immediate")
        .map((e) => ["revision", e[1]]);
    var delayedRevisions = messageStream
        .filter((e) => e[0] === "delayed")
        .map((e) => ["revision", e[1]]).delay(1000);
    var eventStream = Rx.Observable.merge(immediateRevisions, delayedRevisions).publish().refCount();

    Object.defineProperties(this, {
      "eventStream": { get: function() { return eventStream; }},
    });

}


// using the eventStream
var cxn = new Connection(...)
cxn.eventStream.subscribe((e) => {
    if (e[0] === "revision") {
        // ...
    }
});

1 个答案:

答案 0 :(得分:2)

发布和refCounting基本上是shareReplay在RxJS4中的作用。老实说,你应该让你的observable“温暖”,然后使用ReplaySubject作为订阅者,如果你真的想保证最后一条消息被推送给新订阅者,即使订阅数量低于1。 e.g:

const wsStream = Observable.create(observer => {
  ws.onmessage = message => observer.next(message);
  ws.onclose = () => observer.complete();
});

const latestWsMessages = new ReplaySubject(1);
wsStream.subscribe(latestWsMessages);

确保查看Observable的工作方式:创建observable后,通常每个订阅者都会调用订阅(冷),但在这种情况下,您可能需要一个热可观察对象,以便您有多个订阅者共享订阅。有关详情,请参阅Andre's video hereRxJS docs on creating observables

此外,与类一样有用,看起来在这种情况下你只需要makeWebsocketObservable(WebsocketConfig): Observable<WebsocketEvent>

的函数