RxJava - 组合 multiple/different 网络服务调用

RxJava - Combining multiple/different web service calls

我正在使用 Basecamp api 到 return 并显示待办事项列表。这是我目前正在做的一个例子:

bcxClient
  .fetchToDoLists()
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Action1<List<BcxToDoList>>() {
    @Override
    public void call(List<BcxToDoList> bcxToDoLists) {

      for( final BcxToDoList toDoList : bcxToDoLists ) {
        bcxClient
          .fetchToDos( toDoList.bucket.id )
          .subscribeOn( Schedulers.io() )
          .observeOn( AndroidSchedulers.mainThread() )
          .subscribe( new Action1<List<BcxToDo>>() {
            @Override
            public void call(List<BcxToDo> bcxToDos) {
              for( BcxToDo toDo : bcxToDos ) {
                toDoList.toDos.add( toDo );
              }
            }
          }, new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
              throwable.printStackTrace();
            }
          });
      }

      mLoremTextView.setText(bcxToDoLists.get(0).name);
    }

  }, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
      throwable.printStackTrace();
    }
  });

fetchToDoListsfetchToDos 是 return BcxToDoListBcxToDos Observables 的 Retrofit Web 服务调用。

fetchToDoLists 的订阅中,我遍历每个 BcxToDoList,调用 fetchToDos 并将我的 BcxToDo 对象附加到原始列表。

如您所见,它有点冗长。我可以将其分成两个语句以使其更具可读性。但是,这不是很 Rx。在 RxJava 中有没有不同的方法来做到这一点并提高其可读性?

我可以使用 lambda 来使它变得紧凑,但在这个阶段我更感兴趣的是我可以利用 RxJava 中的哪些特性。

你不应该 "break the chain" 在你的 RxJava 调用中,因此你需要 flatMap 来链接它们。 Observable.from() 还允许您将元素列表拆分为单独的 Observable。接下来,您可以使用 toList 将元素放回列表中。这是一个例子:

bcxClient
        .fetchToDoLists()
        .flatMap(new Func1<List<BcxToDoList>, Observable<BcxToDoList>>() {
            @Override
            public Observable<BcxToDoList> call(List<BcxToDoList> bcxToDoLists) {
                return Observable.from(bcxToDoLists);
            }
        })
        .flatMap(new Func1<BcxToDoList, Observable<List<BcxToDo>>>() {
            @Override
            public Observable<List<BcxToDo>> call(BcxToDoList bcxToDoList) {
                return bcxClient
                        .fetchToDos(bcxToDoList.bucket.id);
                        .map(new Func1<List<BcxToDo>, BcxToDoList>() {
                            @Override
                            public BcxToDoList call(List<BcxToDo> bcxToDos) {
                                bcxToDoList.toDos.addAll(bcxToDos);
                                return bcxToDoList;
                            }
                        });
            }
        })
        .toList()
        .subscribe(...);