簡體   English   中英

如何在 rx.js 中鏈接可觀察對象

[英]How to chain observables in rx.js

我有一個 observable,它從服務器拉取事件,過濾應用程序類型的事件,然后訂閱事件並將其分派給一個或多個處理程序來處理。

然后處理程序 go 關閉並對數據庫進行一些異步更新,我發現可觀察對象會如此快速地啟動事件,以至於更新相互影響。 我應該預料到的。

所以我認為我需要我的處理程序每個都使用自己的可觀察對象來充當隊列,該隊列將處理一個事件並等待確認。

所以我的問題是,我怎樣才能創建一個連續接收消息並一次發送一條消息的可觀察對象,等待確認后再發布下一條消息?

我認為可觀察對象也需要是冷的,因為我不能丟失消息。

我認為運營商concatMap所做的事情與您正在尋找的東西很接近。 您可以在此處查看以前的答案,以說明concatMap的類似用例: RxJS 排隊相關任務

它很接近但不完全是你想要的,因為沒有等待ACK信號來釋放下一個值。 相反, concatMap使用當前“已執行”可觀察對象的完成信號來訂閱下一個。 如果您的可觀察對象在某處包含對數據庫執行更新,那么這些更新將按順序執行。 例如:

function handler (source$) {
  // source$ is your source of events from which you generate the update calls
  return source$.concatMap(function (event){
    return updateDB(event);
  })
}

function updateDB(event) {
  return Rx.Observable.create(function(observer){
    // do the update in the db
    // you probably have a success and error handler 
    // you plug the observer notification into those handlers
    if (success) {
      // if you need to pass down some value from the update
      observer.onNext(someValue);
      // In any case, signal completion to allow concatMap to move to next update
      observer.onCompleted();
    }
    if (error) {observer.onError(error);}
  })
}

這是專門針對您正在使用的庫的通用代碼。 您可以直接使用運算符fromNodeCallbackfromCallback ,具體取決於數據庫更新 function 的 API。

盡管如此,請注意,在執行當前可觀察對象時,可能會涉及一些緩沖以保持下一個可觀察對象,並且該緩沖區只能是有限的,因此如果生產者和消費者之間的速度確實存在顯着差異,或 memory 限制,您可能希望以不同的方式處理事情。

此外,如果您使用的是 RxJS v5, onError變為erroronComplete變為completeonNext變為next (參見 新觀察者界面)。

最后評論,您的 stream 的有損/無損性質是一個概念,不同於 stream 的冷熱性質。您可以查看這兩種流的圖示訂閱和數據流。

暫無
暫無

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

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