2014-11-16 4 views
3

Я хочу сделать запрос HTTP повторно и действовать на результат. Я начинаю с public Observable<NewsItem> fetchItems(NewsFeed feed). Один запрос получает несколько новостей, но я решил сгладить его.Как связать асинхронные операции с использованием Java RX Observable?

Идея состояла в том, чтобы использовать Observable.interval() сделать запрос несколько раз, а затем объединить полученные Observables в один.

 Observable 
      .interval(timePerItem, TimeUnit.MILLISECONDS) 
      .map(i -> feed) 
      .map(feed -> fetchItems(feed)) 
      .subscribe(result -> System.out.println(result)); 

Но результат Observable<Observable<NewsItem>> не Observable<NewsItem>. Как их вывести?

Я нашел оператора marge() (RX-Java doc: Marge). Но, похоже, это не подходит для использования.

В предыдущей версии я использовал CompletableFuture<List<NewsItem>> fetchNewsItems(), но я не смог поместить его в цепь Observable.

ответ

3

Не уверен, что я понимаю проблему, но разве вы не просто ищете flatMap?

Observable 
    .interval(timePerItem, TimeUnit.MILLISECONDS) 
    .flatMap(i -> fetchItems(feed)) 
    .subscribe(result -> System.out.println(result)); 
+0

Похоже, это то, что я искал. Изучение rx-java из https://github.com/ReactiveX/RxJava/wiki сложно. flatMap не упоминается во введении и способ, описанный в https://github.com/ReactiveX/RxJava/wiki/Transforming-Observables#flatmap-concatmap-and-flatmapiterable, является странным. Спасибо! – atok

+0

Есть еще много ссылок на большие учебники по адресу http://reactivex.io/tutorials.html. И если вы найдете хороший учебник, который еще не упоминается там, или вы его сами написали, сделайте запрос на растяжение на https://github.com/ReactiveX/reactivex.github.io, чтобы ссылка была включена на эту страницу;) –

Смежные вопросы