Javascript 如何使用fromWebSocket主题缓冲流

Javascript 如何使用fromWebSocket主题缓冲流,javascript,reactive-programming,rxjs,Javascript,Reactive Programming,Rxjs,这(用!)完美地描述了期望的结果: 在突发期间收集缓冲区中的项目,并在每次突发结束时发出这些项目,方法是使用解盎司运算符向缓冲区运算符发出缓冲区关闭指示器 编辑:回顾之后,我的问题似乎与使用主题有关,而不是直接观察到的主题 使用套接字流生成窗口关闭事件(如下所示)会导致2个套接字打开,而没有事件流出: ws = Rx.DOM.fromWebSocket(wsURI, null, wsOpenObserver, wsCloseObserver); var closer = ws.flatMapFi

这(用!)完美地描述了期望的结果:

在突发期间收集缓冲区中的项目,并在每次突发结束时发出这些项目,方法是使用解盎司运算符向缓冲区运算符发出缓冲区关闭指示器

编辑:回顾之后,我的问题似乎与使用主题有关,而不是直接观察到的主题

使用套接字流生成窗口关闭事件(如下所示)会导致2个套接字打开,而没有事件流出:

ws = Rx.DOM.fromWebSocket(wsURI, null, wsOpenObserver, wsCloseObserver);
var closer = ws.flatMapFirst(Rx.Observable.timer(250));
ws.buffer(closer)
    .subscribe(function(e) { console.log(e, 'socket messages');});

与RxJava版本一样,您可以将一个
可观察的
直接传递给
缓冲区
操作符:

source.buffer(source.debounce(150))
这是有效的。看

您展示的使用选择器方法的替代语法将在每次缓冲区关闭时调用该方法,然后订阅它生成的可观察对象


另外,RxJava示例中的解块正在发送缓冲区运算符的结果,默认情况下它不会发送累积结果。

总结此处的发现问题:

  • Rx.DOM.fromWebSocket
    返回环绕websocket的
    Rx.subject
    。该主体由一个观察者和一个可观察者组成(通过
    new Rx.subject(observer,observable)
    。据我所知,该观察者允许通过其
    onNext
    方法写入套接字,而可观察者允许从套接字读取
  • 你总是读到受试者是热源,但显然在这里,这只意味着观察者会立即将其值推送到受试者,而受试者会将其推送到套接字。在正常情况下(
    new Rx.subject()
    ),默认的观察者和可观察者是这样的:可观察者监听观察者,因此默认的可观察者是热的。然而,在这里,可观察者是冷源,然后任何订阅都将重新执行回调,创建另一个websocket。因此创建了两个套接字
  • 例如,
    Rx.dom.fromEvent
    不会发生这种情况,因为创建的(冷)可观察对象是共享的(通过
    publish().refCount()
  • 因此,通过在此处执行相同操作,可以解决复制问题。这意味着在这种特定情况下,在代码中使用
    ws=Rx.DOM.fromWebSocket(wsURI,null,wsOpenObserver,wsCloseObserver).share();
    share
    作为
    publish().refCount()的别名
  • 我想知道
    Rx.DOM.fromWebSocket
    的这种行为是否应该被报告为bug
两种方法的代码:


问题是什么?让我们从“如何在bufferClosingSelector中引用可观察到的源本身”开始。我在这个主题上没有找到任何示例。这很有帮助-我的问题更深一层。请参阅编辑。这应该允许区分正在发生的事情。我的直觉告诉我这里有一个热问题与冷问题,所以请尝试将
.share()
添加到
ws
中。希望只创建一个套接字。然后点击ws查看发出了什么,例如
wsRx.DOM.fromWebSocket(wsURI,null,wsOpenObserver,wsCloseObserver)。点击(*log\u fn*).share()
。您能在这里包括实际的解决方法吗,例如source=Rx.DOM.fromWebSocket(wsURI,null,wsOpenObserver,wsCloseObserver).share()