Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava doOnError和onErrorReturn是如何工作的?_Java_System.reactive_Rx Java - Fatal编程技术网

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
不会改变订阅者的行为-您只需添加第二个错误侦听器。