【发布时间】: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”——似乎都没有调用doOnError 和onErrorReturn。
doOnError被记录为:
修改源 Observable 以便在调用 onError 时调用操作。
我不确定如何解释,但我希望输出“doOnError”或“doOnError”后跟“subscribe.onError”。
onErrorReturn 记录为:
指示 Observable 发出一个项目(由指定函数返回),而不是在遇到错误时调用 onError。
因此我期待“得到:是的,我得到了这个”作为后一个测试的输出。
什么给了?
【问题讨论】:
标签: java system.reactive rx-java