如何在flatMap()中等待Observable的onComplete()

Eug*_*ene 7 rx-java

我有一个Observable从数据库中读取数据的人.如果数据是null我需要从网络获取它.所以,我做flatMap的第一Observable,检查数据库操作的结果,如果它是null我开始另一个Observable从网络上获取数据.

注意: Observable s有不同的Subscribers因为我有不同的后处理,具体取决于数据的来源(这样的逻辑).

 Observable.just(readDataFromDb()).flatMap(new Func1<SomeData, Observable<String>>() {
        @Override public Observable<SomeData> call(SomeData s) {
          if (s == null) {
            getReadFromNetworkObservable().subscribe(new AnotherSubscriber()); // this one might not complete
            return Observable.empty(); // I think I need to send this one only after readFromNetwork() completed
          } else {
            return Observable.just(s);
          }
        }
      }).subscribe(new SomeSubscirber());
Run Code Online (Sandbox Code Playgroud)

鉴于我发送Observable.empty()排除数据处理SomeSubscriber,我有一个预感我的第二个Observable不能总是完成,因为它可能只是垃圾收集.我想我在测试中看到了它.

此时,我想我只需要等到Observable谁从网络中读取完毕然后发送Observable.empty().那么我可以使执行同步吗?但我仍然觉得我做错了.

Ser*_*kyi 7

您可以使用.toBlocking快捷方式将任何observable视为阻塞(请参阅完整信息https://github.com/ReactiveX/RxJava/wiki/Blocking-Observable-Operators)

Data d = getReadFromNetworkObservable()
            .toBlocking()
            .first() //  or single() or singleOrDefault()

// manipulate with data here
Run Code Online (Sandbox Code Playgroud)

此处描述了将缓存与网络数据相结合:http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/

在这里:RxJava和缓存数据