[英]How to wait for async Observable to complete
我正在嘗試使用rxjava構建一個示例。 該示例應協調ReactiveWareService和ReactiveReviewService重新運行WareAndReview組合。
ReactiveWareService
public Observable<Ware> findWares() {
return Observable.from(wareService.findWares());
}
ReactiveReviewService: reviewService.findReviewsByItem does a ThreadSleep to simulate a latency!
public Observable<Review> findReviewsByItem(final String item) {
return Observable.create((Observable.OnSubscribe<Review>) observer -> executor.execute(() -> {
try {
List<Review> reviews = reviewService.findReviewsByItem(item);
reviews.forEach(observer::onNext);
observer.onCompleted();
} catch (Exception e) {
observer.onError(e);
}
}));
}
public List<WareAndReview> findWaresWithReviews() throws RuntimeException {
final List<WareAndReview> wareAndReviews = new ArrayList<>();
wareService.findWares()
.map(WareAndReview::new)
.subscribe(wr -> {
wareAndReviews.add(wr);
//Async!!!!
reviewService.findReviewsByItem(wr.getWare().getItem())
.subscribe(wr::addReview,
throwable -> System.out.println("Error while trying to find reviews for " + wr)
);
}
);
//TODO: There should be a better way to wait for async reviewService.findReviewsByItem completion!
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
return wareAndReviews;
}
鑒於我不想返回一個Observable,我怎么能等待異步Observable(findReviewsByItem)完成?
您的大多數示例都可以使用標准的RxJava運算符重寫,這些運算符可以很好地協同工作:
public class Example {
Scheduler scheduler = Schedulers.from(executor);
public Observable<Review> findReviewsByItem(final String item) {
return Observable.just(item)
.subscribeOn(scheduler)
.flatMapIterable(reviewService::findReviewsByItem);
}
public List<WareAndReview> findWaresWithReviews() {
return wareService
.findWares()
.map(WareAndReview::new)
.flatMap(wr -> {
return reviewService
.findReviewsByItem(wr.getWare().getItem())
.doOnNext(wr::addReview)
.lastOrDefault(null)
.map(v -> wr);
})
.toList()
.toBlocking()
.first();
}
}
無論何時想要組合這樣的服務,首先要考慮flatMap
。 你不需要為每個子Observable阻塞,但是如果真的有必要,只需要在最后使用toBlocking()
。
您可以使用BlockingObservable中的方法,請參閱https://github.com/Netflix/RxJava/wiki/Blocking-Observable-Operators 。 例如
BlockingObservable.from(reviewService.findReviewsByItem(..)).toIterable()
另一種方法是在開始之前聲明CountdownLatch。 然后在onCompleted()上的那個鎖存器上調用countDown()。 然后,您可以使用該鎖存器上的await()替換Thread.sleep()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.