RxJava doOnError和onErrorReturn是如何工作的?
我做了这些单元测试,结果根本不是我所期望的:RxJava doOnError和onErrorReturn是如何工作的?,java,system.reactive,rx-java,Java,System.reactive,Rx Java,我做了这些单元测试,结果根本不是我所期望的: // This one outputs "subscribe.onError" @Test public void observable_doOnError_subscribingToError() throws InterruptedException { Observable<String> obs = getErrorProducingObservable(); obs.doOnError(throwable -&
// 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"));
});
}
//这一个输出“subscribe.onError”
@试验
public void observeable_doOnError_subscribingToError()引发InterruptedException{
可观测的obs=getErrorProducingObservable();
obs.doon错误(可丢弃->系统输出.println(“doon错误”);
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s->{},
错误->System.out.println(“subscribe.onError”)
);
睡眠(300);
}
//这一个输出“subscribe.onError”
@试验
public void observable_onerrorrurn()抛出InterruptedException{
可观测的obs=getErrorProducingObservable();
obs.onerrorrurn(throwable->“是的,我得到了这个”);
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s->System.out.println(“got:+s),
错误->System.out.println(“subscribe.onError”)
);
睡眠(300);
}
私有可观测getErrorProducingObservable(){
返回可观察。创建(订户->{
onError(新的运行时异常(“有人给我们设置了炸弹”);
});
}
因此,两个输出“subscribe.onError”-似乎都没有调用doOnError
或onerrorrurn
doon错误
记录如下:
修改源Observable,以便在调用onError时调用操作
我不知道该如何解释,但我希望输出“doOnError”或“doOnError”后跟“subscribe.onError”
onErrorReturn
记录如下:
指示可观察对象在遇到错误时发出项(由指定函数返回),而不是调用onError
因此,我期望“得到:是的,我得到了这个”作为后一个测试的输出
有什么好处 两个
doError
和OneErrorReturn
都返回一个新的可观察的
,其行为发生了变化。我同意他们的文件可能有点误导。按如下方式修改测试以获得预期的行为:
// 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"));
});
}
//这一个输出“subscribe.onError”
@试验
public void observeable_doOnError_subscribingToError()引发InterruptedException{
可观测obs=
getErrorProducingObservable()
.doon错误(可丢弃->系统输出.println(“doon错误”);
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s->{},
错误->System.out.println(“subscribe.onError”)
);
睡眠(300);
}
//这一个输出“subscribe.onError”
@试验
public void observable_onerrorrurn()抛出InterruptedException{
可观测obs=
getErrorProducingObservable()
.OneRorReturn(可丢弃->“是的,我得到了这个”);
obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
s->System.out.println(“got:+s),
错误->System.out.println(“subscribe.onError”)
);
睡眠(300);
}
私有可观测getErrorProducingObservable(){
返回可观察。创建(订户->{
onError(新的运行时异常(“有人给我们设置了炸弹”);
});
}
啊,谢谢。现在它按预期工作,我了解到doError
不会改变订阅者的行为-您只需添加第二个错误侦听器。