Я ищу лучший способ добиться простой системы Observable fallback для пустых результатов при использовании RxJava. Идея состоит в том, что если локальный запрос для набора данных приводит к нулевым элементам, тогда вместо него должен быть сделан резервный запрос (может быть сетевой вызов или что-то еще). В настоящее время мой код состоит из следующего:
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
...
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
, похоже, будет запускаться дважды в том случае, если есть непустые элементы, которые являются прерываниями транзакций.