【问题标题】:How does RxJava doOnError and onErrorReturn work?RxJava doOnError 和 onErrorReturn 是如何工作的?
【发布时间】:2015-09-02 08:52:35
【问题描述】:

我做了这些单元测试,结果完全出乎我的意料:

// 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”——似乎都没有调用doOnErroronErrorReturn

doOnError被记录为:

修改源 Observable 以便在调用 onError 时调用操作。

我不确定如何解释,但我希望输出“doOnError”或“doOnError”后跟“subscribe.onError”。

onErrorReturn 记录为:

指示 Observable 发出一个项目(由指定函数返回),而不是在遇到错误时调用 onError。

因此我期待“得到:是的,我得到了这个”作为后一个测试的输出。

什么给了?

【问题讨论】:

    标签: java system.reactive rx-java


    【解决方案1】:

    doOnErroronErrorReturn 都返回一个新的 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"));
        });
    }
    

    【讨论】:

    • 啊,谢谢。现在它按预期工作了,我了解到doOnError 不会改变订阅者的行为 - 您只需添加第二个错误侦听器。
    猜你喜欢
    • 2020-09-22
    • 2019-09-06
    • 2019-03-28
    • 2020-05-13
    • 1970-01-01
    • 2020-01-29
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多