【问题标题】:RXJava handling nested callsRXJava 处理嵌套调用
【发布时间】:2017-02-23 11:01:18
【问题描述】:

假设我有一个服务来检索一些作者(id、名字、姓氏、生日、国籍),还有一个服务来检索作者的书(标题、摘要、页数)。 我希望我的网络电话向我返回一份作者名单及其书籍。

为了说明,我的服务将返回我 AuthorOResponse 和 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)

我想用它们发出一个 Observable 但不知道怎么做,因为我对 getAuthorBooks 的每个调用都需要一个作者。

我想出了一些看起来像这样的东西,但我遇到了一个问题,因为我的 concatMap 让我“失去”了我的作者。

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

有人知道我该怎么做吗?

【问题讨论】:

    标签: android retrofit rx-java


    【解决方案1】:

    您可以使用专为此类情况设计的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>>
    

    【讨论】:

    • 这看起来真的很棒。因为我想发出一个 Observable 我会让 flatMap 返回我的作者,但它工作得很好。谢谢!
    【解决方案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;
                            }
                        });
            }
        });
    

    查询作者,将每个AuthorResponse 映射到AuthorObject,然后对每个Authormap 使用flatMap 查询书籍,以便将解析的书籍添加到之前生成的AuthorObject。 最后你会得到一个Observable,它会发出AuthorObject,并填充他们的书单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      相关资源
      最近更新 更多