我从一个名为getAlldata()
的方法获得Flowable
此方法将从服务器获取数据,然后根据存储在数据库中的数据修改返回的数据。
所以这个方法的过程是这样的:
问题是:
结果将在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();
}
答案 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();