I'm trying to build a sample using rxjava. The sample should orchestrate a ReactiveWareService and a ReactiveReviewService retruning a WareAndReview composite.
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; }
Given the fact I don't want to return an Observable, how can I wait for async Observable (findReviewsByItem) to complete?