从RxJava获得2个观察结果中的一个结果
问题描述:
我是RxJava的新手,我有些难以执行我的第一个'困难'查询。从RxJava获得2个观察结果中的一个结果
我有两个从Retrofit生成的Observable,一个'ping'一个新的API,另一个是旧的。第一个将询问'http://myurl.com/newapi/ping',第二个'http://myurl.com/oldapi/ping'。这个请求的结果并不重要,我只想知道服务器是使用新的还是旧的api。
所以我想同时调用两个observable,最后在最后有一个布尔值来知道我是使用旧的还是新的api。
我想类似的东西
Observable.mergeDelayError(obsOldApi,obsNewApi)
.observeOn(AndroidSchedulers.mainThread(), true)
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
});
但onError的将被调用一次(我想,如果这两个请求无法被才叫),当onNext叫,我不知道从哪个请求它来了(旧的还是新的api?)。
谢谢你的帮助
答
为了简单起见,我们说,你会收到"NEW"
或"OLD"
关于其API是可用的。
您的操作难度在于管理错误:RxJava将错误作为终端状态进行处理。因此,您必须忽略此错误,例如使用.onErrorResumeNext()
。
Observable<String> theOld = oldApi.map(r -> "OLD")
// ignore errors
.onErrorResumeNext(Obervable.empty());
Observable<String> theNew = newApi.map(r -> "NEW")
.onErrorResumeNext(Obervable.empty());
Observable.merge(theOld, theNew)
.first() // if both api are in errors
.subscribe(api -> System.out.println("Available API : "+api));
我添加操作first
:它将采取仅第一结果("OLD"
或"NEW"
),但如果先前Observable
是空的,这是这种情况,如果两个API是unavaible触发一个错误。
+0
看起来优雅并且像魅力一样工作,谢谢! –
您可以使用'onErrorResume',但这意味着只有在另一个失败的情况下调用一个API – njzk2