RxJava 的回退 Observable [英] Fallback Observable for RxJava
问题描述
我正在寻找一种更好的方法来在使用 RxJava 时为空结果实现简单的 Observable 回退系统.这个想法是,如果对一组数据的本地查询导致零项,那么应该进行回退查询(可能是网络调用或其他东西).目前,我的代码包括以下内容:
I'm in search for a better way to achieve a simple Observable fallback system for empty results when using RxJava. The idea is that, if a local query for a set of data results in zero items, then a fallback query (could be a network call, or something else) should be made instead. Currently, my code consists of the following:
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
List<Object> results = queryLocalDatabase();
if (results.isEmpty()) {
subscriber.onError(new Throwable("Empty results"));
} else {
// Process results...
}
}
}).onErrorResumeNext(/* Fallback Observable goes here */);
虽然这有效,但对空结果集抛出异常并没有多大意义.我注意到有条件运算符可用,例如 isEmpty
,但它似乎并没有让我到达我想要的位置.例如,使用 isEmpty
...
Although this works, it doesn't quite make sense to throw an exception for an empty result set. I noticed that there are conditional operators available such as isEmpty
, however it doesn't seem like it gets me where I want to be. For example, using isEmpty
...
localObservable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
List<Object> results = queryLocalDatabase();
for (Object obj : results) {
// Process object
subscriber.onNext(object);
}
subscriber.onCompleted();
}
});
localObservable.isEmpty()
.switchMap(new Func1<Boolean, Observable<? extends Object>>() {
@Override
public Observable<? extends Object> call(Boolean isEmpty) {
if (isEmpty) {
// Return fallback Observable.
return fallbackObservable;
}
// Return original Observable, which would mean running the local query again... Not desired.
return localObservable;
}
});
这几乎让我到达了我想去的地方,除了 localObservable
似乎会在有非空项目的情况下运行两次,这是一个交易破坏者.
This almost gets me to where I want to be, with the exception that the localObservable
will seemingly be ran twice in the event that there are non-empty items, which is a deal breaker.
推荐答案
使用 switchIfEmpty
运算符.
有用法示例:
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
// return no item
//subscriber.onNext(...);
System.out.println("Generating nothing :)");
subscriber.onCompleted();
}
}).switchIfEmpty(Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
System.out.println("Generating item");
subscriber.onNext("item");
subscriber.onCompleted();
}
})).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onNext(String s) {
System.out.println("onNext: " + s);
}
});
用 lamdas 简化:
Simplified with lamdas:
Observable.create(subscriber -> {
// return no item
//subscriber.onNext(...);
System.out.println("Generating nothing :)");
subscriber.onCompleted();
}).switchIfEmpty(Observable.create(subscriber -> {
System.out.println("Generating item");
subscriber.onNext("item");
subscriber.onCompleted();
})).subscribe(
s -> System.out.println("onNext: " + s),
throwable -> System.out.println("onError"),
() -> System.out.println("onCompleted")
);
这篇关于RxJava 的回退 Observable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!