2017-02-23 134 views
1

想象一下,我有一項服務來檢索一些作者(id,名字,姓氏,生日,國籍)和第二項檢索作者書籍(標題,摘要,頁數)的服務。 我希望我的網絡電話能夠爲我返回一份帶有書籍的作者列表。RXJava處理嵌套調用

爲了說明,我的服務將返回Author Authoresponse和BookResponse,並且我想發出AuthorObject的Observable。

public class AuthorResponse { 
    private String id; 
    private String firstname; 
    private String lastname; 
    private Date birthday; 
    private String nationality; 
} 

public class BookResponse { 
    private String title; 
    private String summary; 
    private int pageNumber; 
} 

public class AuthorObject { 
    private String id; 
    private String firstname; 
    private String lastname; 
    private Date birthday; 
    private String nationality; 
    private List<BookObject> books 
} 

我的服務會像

Observable<List<AuthorResponse>> getAuthors() 
Observable<List<BookResponse>> getAuthorBooks(String authorId) 

我想用它們發射可觀察到的,但無法弄清楚如何做到這一點,因爲我的每一個電話到getAuthorBooks需要一個作者。

我想出了這樣的東西,但我有一個問題,因爲我的concatMap讓我「鬆散」我的作者。

myServices.getAuthors() 
       .map(author -> createAuthor()) 
       .concatMap(author -> mWebService.getAuthorBooks(author.getId()) 
       .flatMapIterable(data -> data.items) 
       .map(book -> addBook()) 

有人知道我該怎麼做嗎?

回答

5

你可以使用special flatMap overload專爲這種情況:

myServices.getAuthors() 
    .map(author -> createAuthor()) 
    .flatMap(author -> mWebService.getAuthorBooks(author.getId()), 
      (author, data) -> { 
       author.setBooks(data.items)); 
       return Observable.just(author); 
      }) 
    .toList() //here is your Observable<List<Author>> 
+1

這似乎真的很棒。 因爲我想發出一個Observable ,我將使flatMap返回我的作者,但它工作得很好。 謝謝! – Tibo

2

也許是這樣的:

getAuthors.map(new Func1<List<AuthorResponse>, AuthorObject>() { 
     @Override 
     public AuthorObject call(List<AuthorResponse> authorResponses) { 
      return createAuthor(); 
     } 
    }).flatMap(new Func1<AuthorObject, Observable<AuthorObject>>() { 
     @Override 
     public Observable<AuthorObject> call(final AuthorObject authorObject) { 
      return getAuthorBooks(authorObject.id) 
        .map(new Func1<List<BookResponse>, AuthorObject>() { 
         @Override 
         public AuthorObject call(List<BookResponse> bookResponses) { 
          authorObject.books = parseBooks(bookResponses); 
          return authorObject; 
         } 
        }); 
     } 
    }); 

查詢的作者,地圖中的每個AuthorResponseAuthorObject,然後使用flatMap查詢書籍每個Author,並map它以解析的書籍添加到前面生成AuthorObject。 最後你會得到一個Observable發出AuthorObject與他們的書籍列表填充。

+0

好像是確實工作。謝謝 ! – Tibo