我有两个可观察者/Zc:forScope-
& apiService.getFeed()
我想在同一个屏幕上加载两个数据。为了做到这一点并处理错误,我需要在apiService.getProfile()
之后调用apiService.getProfile()
。
我查了很多例子,但大部分都是使用flatMap&我不确定我们是否可以使用它,特别是因为这两个可观察类型具有不同的类型,并且两者在价值方面都是独立的。
答案 0 :(得分:1)
这就是我使用Retrofit
的{{1}}嵌套两个RxJava2
来电的方法:
flatMap
但如果它是两种不同的可观察类型,您还可以使用flatMap的不同变体:
apiService.getFeed(param1, param2, ...)
.flatMap(result -> apiService.getProfile(param1, param2, ...))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
//do something here
}, throwable -> {
view.showErrorMessage(throwable.getMessage());
});
- 返回flatMap
Single
- 返回flatMapCompletable
Completable
- 返回flatMapMaybe
Maybe
- 返回flatMapObservable
Observable
- 返回flatMapPublisher
答案 1 :(得分:0)
将您的改造响应返回为“可观察”,然后使用zip运算符。 http://reactivex.io/documentation/operators/zip.html
当一个api调用依赖于另一个api调用时,zip运算符是理想的,因为Zip运算符按顺序组合了两个可观察对象的发射。
Observable <String> feed = apiService.getFeed("param");
Observable <String> profile = apiService.getProfile("param");
Observable.zip(
feed, profile,
new Func2<String, String, ResultType>() {
@Override
public ResultType call(String feedResponse,
String profileResponse) {
// Do something with the feedResponse
// Do something with the profileResponse
// Return something with ResultType
return something;
}
}).subscribe(
//Once requests process are done
new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
//on successful completion of the request
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable e) throws Exception {
//on error
}
});