0
の内側に発生する終了を飲み込むしない:OnErrorReturnは考えてみましょう。この例をflatMap
@Test
public void testOnErrorReturn() {
final Observable<String> stringObservable = Observable.defer(new Callable<ObservableSource<String>>() {
@Override
public ObservableSource<String> call() throws Exception {
throw new RuntimeException("Too Bad");
}
});
Observable<String> observable = Observable.intervalRange(0, 5, 0, 500, TimeUnit.MILLISECONDS)
.flatMap(new Function<Long, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(@NonNull Long aLong) throws Exception {
return stringObservable;
}
})
.onErrorReturn(new Function<Throwable, String>() {
@Override
public String apply(@NonNull Throwable throwable) throws Exception {
return "That Passed";
}
})
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
System.out.println("OnComplete first stream.");
}
});
observable.mergeWith(Observable.<String>never())
.doOnNext(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
System.out.println("accept() called with: s = [" + s + "]");
}
})
.test().awaitDone(5, TimeUnit.SECONDS);
}
出力:
accept() called with: s = [That Passed]
OnComplete first stream.
それだけ、このようなflatMap
内onErrorReturn
設定した場合は動作します:
return stringObservable.onErrorReturn(new Function<Throwable, String>() {
@Override
public String apply(@NonNull Throwable throwable) throws Exception {
return "That Passed early";
}
});
しかし、私はチェーン内のエラー情報を失います。どのように私はストリームを生きて維持し、優雅に終了を抑制することができますか?
2番目のケースでどのエラー情報を失っていますか?私が理解しているものから、最初のものは最初の試行で終了し、2番目のものはエラーのある5つのアイテムを出して終了します。 – masp