RxJava阻塞流直到其他观察者完成

时间:2018-01-21 15:21:16

标签: java android rx-java rx-java2

我从一个名为getAlldata()的方法获得Flowable 此方法将从服务器获取数据,然后根据存储在数据库中的数据修改返回的数据。

所以这个方法的过程是这样的:

  1. 来自服务器的getdata
  2. 每个项目的
  3. doOnNext获取id
  4. 通过id获取本地数据。
  5. 修改当前项目
  6. 问题是:

    结果将在doOnNext()中修改数据之前返回,因为从DB获取本地数据是另一个可观察的。

    问题

    如何在doOnNext()上的其他可观察对象完成之前延迟流?

    代码

       private Flowable<List<MyModule>> getAlldata() {
             return remoteDataSource
                                .getData().flatMap(data -> Flowable.fromIterable(data))
                                .doOnNext(new Consumer<MyModule>() {
                                    @Override
                                    public void accept(MyModule singleItem) throws Exception {
                                        localDataSource.getData(singleItem.getId())
                                        .firstElement().toFlowable()
                                        .subscribe(new Consumer<Optional<MyModule>>() {
                                            @Override
                                            public void accept(Optional<MyModule> itemOptional) throws Exception {
                                                if (itemOptional.isPresent()) {
                                                   // modify the item
                                                }
    
                                            }
                                        });
    
    
                                    }
                                })
                                .distinct()
                                .sorted(ProductsRepository.this::sortItems)
                                .toList().toFlowable();
        }
    

1 个答案:

答案 0 :(得分:0)

使用flatmap运算符代替doOnNext(),它将singleItem作为参数并抛出localdatabase类型的observable。所以现在你可以映射响应,而不是让你的Observable等待。

Observable<ModuleData> obs = remoteDataSource
         .getData().flatMapIterable(data ->data)
         .flatMap(singleItem->localDataSource.getData(singleItem.getId()))
          .distinct()
          .sorted(ProductsRepository.this::sortItems)
          .toList().toFlowable();