Как работает RxJava doOnError и onErrorReturn?
Я сделал эти модульные тесты, и результат совсем не то, что я ожидал:
// This one outputs "subscribe.onError"
@Test
public void observable_doOnError_subscribingToError() throws InterruptedException {
Observable<String> obs = getErrorProducingObservable();
obs.doOnError(throwable -> System.out.println("doOnError"));
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s -> {},
error -> System.out.println("subscribe.onError")
);
Thread.sleep(300);
}
// This one outputs "subscribe.onError"
@Test
public void observable_onErrorReturn() throws InterruptedException {
Observable<String> obs = getErrorProducingObservable();
obs.onErrorReturn(throwable -> "Yeah I got this");
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s -> System.out.println("got: " + s),
error -> System.out.println("subscribe.onError")
);
Thread.sleep(300);
}
private Observable<String> getErrorProducingObservable() {
return Observable.create(subscriber -> {
subscriber.onError(new RuntimeException("Somebody set up us the bomb"));
});
}
так что оба вывода " подписаться.onError " - ни doOnError
, ни onErrorReturn
кажется, называлась.
doOnError
описан как:
изменяет источник, наблюдаемый так, что он вызывает действие, если он вызывает onError.
Я не уверен, как intepret, но я ожидал либо "doOnError" для выхода или "doOnError", а затем "подписывать.метод onerror".
onErrorReturn
описан как :
инструктирует Observable испускать элемент (возвращаемый указанной функцией), а не вызывать onError, если он обнаруживает ошибку.
следовательно, я ожидал "получил: Да, я получил это" как результат последнего теста.
что это дает?
1 ответов
и doOnError
и onErrorReturn
возвращает новый Observable
с измененным поведением. Я согласен с тем, что их документация может немного вводить в заблуждение. Измените свои тесты, чтобы получить ожидаемое поведение:
// This one outputs "subscribe.onError"
@Test
public void observable_doOnError_subscribingToError() throws InterruptedException {
Observable<String> obs =
getErrorProducingObservable()
.doOnError(throwable -> System.out.println("doOnError"));
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s -> {},
error -> System.out.println("subscribe.onError")
);
Thread.sleep(300);
}
// This one outputs "subscribe.onError"
@Test
public void observable_onErrorReturn() throws InterruptedException {
Observable<String> obs =
getErrorProducingObservable()
.onErrorReturn(throwable -> "Yeah I got this");
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s -> System.out.println("got: " + s),
error -> System.out.println("subscribe.onError")
);
Thread.sleep(300);
}
private Observable<String> getErrorProducingObservable() {
return Observable.create(subscriber -> {
subscriber.onError(new RuntimeException("Somebody set up us the bomb"));
});
}