OnErrorReturn不会吞下导致flatMap内部的终止

时间:2017-08-16 12:47:20

标签: java rx-java rx-java2

考虑这个例子:

   @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.

只有在onErrorReturn内设置flatMap时才有效:

return stringObservable.onErrorReturn(new Function<Throwable, String>() {
                        @Override
                        public String apply(@NonNull Throwable throwable) throws Exception {
                            return "That Passed early";
                        }
                    });

但是我在链中丢失了错误信息。如何保持流存活并优雅地抑制终止?

1 个答案:

答案 0 :(得分:0)

这取决于你想要做什么。一种选择是将flatMap内的错误和成功值映射到Try类型,然后在外Observable处理。

另一种选择是使用.flatMap(function, true)延迟错误,然后流将处于活动状态直到完成,您将能够处理成功的值,并最终会收到复合错误通知。