簡體   English   中英

RxJava過濾后合並多個觀察者

[英]RxJava Combining Multiple Observer after filter

以下是我當前的代碼

  private final List<Disposable> subscriptions = new ArrayList<>();

  for (Instrument instrument : instruments) {
    // Waiting for OrderBook to generate Reliable results.
    GenericBook Book =
        service
            .getBook(instrument.getData())
            .filter(gob -> onBookUpdate(gob))
            .blockingFirst();

    subscriptions.add(
        service
            .getBook(instrument.getData())
            .subscribe(
                gob -> {
                  try {
                    onBookUpdate(gob);
                  } catch (Exception e) {
                    logger.error("Error on subscription:", e);
                  }
                },
                e -> logger.error("Error on subscription:", e)));
  }

因此,對於每個儀器,它首先執行的操作是等待onBookUpdate(gob)的輸出變為true。 onBookUpdate(gob)返回布爾值。 一旦我們首先將onBookUpdate為true,那么我將將該訂閱者推送到subscriptions變量中。

由於我必須等待每台儀器,然后繼續使用下一個儀器,所以速度變慢。

我的目標是並行運行所有這些,然后等待所有完成並將其推送到subscriptions變量。

我嘗試過拉鏈,但沒有用

  List<Observable<GenericOrderBook>> obsList = null;
  for (Instrument instrument : instruments) {
    // This throws nullException.
   obsList.add(service
            .getBook(instrument.getData())
            .filter(gob -> onBookUpdate(gob))
            .take(1));
    }
  }
// Some how wait over here until all get first onBookUpdate as true.
String o = Observable.zip(obsList, (i) -> i[0]).blockingLast();

當使用可觀察物等時,應該全心全意地擁抱它們。 擁抱的前提之一是將管道的配置和構造與執行分開。

換句話說,先配置管道,然后在數據可用時通過它發送數據。

此外,擁抱可觀察對象意味着避免for循環。

我不是100%用例,但我建議創建一個將工具作為輸入並返回訂閱的管道...

所以像

service.getBook(instrument.getData())
 .flatMap(gob -> {
   onBookUpdate(gob);
   return gob;
});

這將返回您可以訂閱的Observable ,並將結果添加到訂閱中。

然后創建可觀察的種子,將儀器對象泵入其中。

不確定您的API的一些細節,如果不清楚或我做錯了假設,請回來找我。

我假設instruments是一個清單。 如果是,那么您可以執行以下操作,

Observable
    .fromIterable(instruments)
    // Returns item from instrument list one by one and passes it to getBook()
    .flatmap(
        instrument -> getBook(instrument.getData())
    )
    .filter(
        gob -> onBookUpdate(gob)
    )
    // onComplete will be called if no items from filter 
    .switchIfEmpty(Observable.empty())
    .subscribe(
        onBookUpdateResponse -> // Do what you want,
        error -> new Throwable(error)
    );

希望這可以幫助。

暫無
暫無

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

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