使用 RxJava 从 2 个可观察对象中获取一个结果
Get one result from 2 observables with RxJava
我是 RxJava 的新手,执行第一个 'difficult' 查询时有些痛苦。
我有两个从 Retrofit 生成的 Observable,一个 'ping' 一个新的 api,另一个是旧的。第一个将查询“http://myurl.com/newapi/ping', the second one 'http://myurl.com/oldapi/ping”。这个请求的结果并不重要,我只想知道服务器使用的是新的还是旧的 api.
所以我想同时调用两个 observables,最后有一个布尔值来知道我使用的是旧的还是新的 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 都不可用,就是这种情况。
我是 RxJava 的新手,执行第一个 'difficult' 查询时有些痛苦。
我有两个从 Retrofit 生成的 Observable,一个 'ping' 一个新的 api,另一个是旧的。第一个将查询“http://myurl.com/newapi/ping', the second one 'http://myurl.com/oldapi/ping”。这个请求的结果并不重要,我只想知道服务器使用的是新的还是旧的 api.
所以我想同时调用两个 observables,最后有一个布尔值来知道我使用的是旧的还是新的 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 都不可用,就是这种情况。