[英]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.