Javascript 操作RxJS流并发布可观察结果的正确方法是什么?

Javascript 操作RxJS流并发布可观察结果的正确方法是什么?,javascript,rxjs,Javascript,Rxjs,我有一个websocket连接,它正在使用ReplaySubject生成内部消息事件。我处理这些事件并为某些消息添加延迟。在内部,我使用publish().refCount()两次,一次在内部ReplaySubject上,另一次在发布的输出流上 内部主题是否应该同时调用“publish”和“refCount”?我使用“publish”是因为我有多个订阅者,但我不完全确定何时使用“refCount” 只处理内部主体可以吗?这会清理掉其他一切吗 订阅“eventStream”的用户应获得最新版本,但

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

内部主题是否应该同时调用“publish”和“refCount”?我使用“publish”是因为我有多个订阅者,但我不完全确定何时使用“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") {
        // ...
    }
});

发布和引用计数基本上就是RxJS4中的
shareReplay
所做的。老实说,如果您真的想保证最后一条消息被推送到新的订阅者手中,那么您应该让您的可观察对象“温暖”,然后使用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);
确保您查看了可观察对象的工作方式:在创建了可观察对象之后,通常每个订阅者都会调用订阅(cold),但在这种情况下,您可能需要一个热可观察对象,以便有多个订阅者共享一个订阅。有关更多信息,请参阅和


此外,类尽可能有用,在本例中,看起来您只需要一个函数
makeWebsocketObservable(WebsocketConfig):Observable

,这是一个很好的答案,但我建议扩展“shareReplay”的功能(did?),并可能扩展到dispose。我基本上需要一些关于加入和共享流的指导。我会查看你的链接!谢谢