簡體   English   中英

如何使用 fromWebSocket Subject 緩沖流

[英]How to buffer stream using fromWebSocket Subject

這個RxJava 緩沖區示例(帶有彈珠!)完美地描述了所需的結果:

在突發期間收集緩沖區中的項目,並在每次突發結束時發出它們,方法是使用 debounce 運算符向緩沖區運算符發出緩沖區關閉指示符

編輯:已經回顧了如何創建一個 RxJS 緩沖區,該緩沖區對 NodeJS 中的元素進行分組,但不依賴於永久運行間隔? ,我的問題似乎與使用 Subject 而不是直接 Observable 相關

使用套接字流生成窗口關閉事件(如下)會導致 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');});

在這里總結調查結果問題:

  • Rx.DOM.fromWebSocket返回一個包含 websocket 的Rx.subject 該主題由一個觀察者和一個可觀察對象組成(通過new Rx.Subject(observer, observable) 。據我new Rx.Subject(observer, observable) ,該觀察者允許通過其onNext方法寫入套接字,而可觀察對象允許從套接字讀取。
  • 你總是讀到主題是熱源,但顯然這里只意味着觀察者會立即將其值推送到主題,主題在這里將其推送到套接字。 在正常情況下( new Rx.Subject() ),默認觀察者和可觀察者是這樣的,觀察者會監聽觀察者,因此默認的可觀察者是熱的。 然而,這里的 observable 是一個冷源,然后任何訂閱都將重新執行創建另一個 websocket 的回調。 因此創建了兩個套接字。
  • 例如,這不會發生在Rx.dom.fromEvent因為創建的(冷)observable 是共享的(通過publish().refCount() )。
  • 因此,通過在這里做同樣的事情,可以解決重復問題。 這意味着在這種特殊情況下,在您的代碼中使用ws = Rx.DOM.fromWebSocket(wsURI, null, wsOpenObserver, wsCloseObserver).share(); , sharepublish().refCount()的別名。
  • 我想知道Rx.DOM.fromWebSocket行為是否應該報告為錯誤

兩種方法的代碼:

您可以像 RxJava 版本一樣將Observable直接傳遞給buffer運算符:

source.buffer(source.debounce(150))

已驗證。 這里

您展示的使用選擇器方法的替代語法將在每次緩沖區關閉時調用該方法,然后訂閱它生成的 Observable。

此外,RxJava 示例中的 debounce 會發出緩沖區運算符的結果,默認情況下它不會發出累積結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM