[英]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();
, share
是publish().refCount()
的別名。Rx.DOM.fromWebSocket
行為是否應該報告為錯誤兩種方法的代碼:
您可以像 RxJava 版本一樣將Observable
直接傳遞給buffer
運算符:
source.buffer(source.debounce(150))
已驗證。 見這里。
您展示的使用選擇器方法的替代語法將在每次緩沖區關閉時調用該方法,然后訂閱它生成的 Observable。
此外,RxJava 示例中的 debounce 會發出緩沖區運算符的結果,默認情況下它不會發出累積結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.