RxJava - 继续无限流

时间:2016-12-08 10:55:59

标签: rx-java

我看到了另一个类似的问题,但它没有解决我的问题:

        Observable<Integer> resumeSequence = Observable.just(-1);       
        Observable.just(1,0,2,5)
          .flatMap(x -> 
                      Observable.just(10/x)
                      //.onErrorReturn(error -> -1)
                      .onErrorResumeNext(resumeSequence)
                      .onExceptionResumeNext(resumeSequence)
              )
//        .onErrorReturn(error -> -1)
          .onErrorResumeNext(resumeSequence)
          .onExceptionResumeNext(resumeSequence)
          .subscribe(System.out::println, 
                      throwable -> System.out.println("IN ERROR CALLBACK" + throwable));

理想情况下,Resume应该在flatMap中。输出应打印4个数字&amp; flow不应该转到Error Callback。

1 个答案:

答案 0 :(得分:2)

Observable.just对已计算的值非常有用。

你的代码吼叫

 Observable.just(1,0,2,5)
      .flatMap(x -> 
                  Observable.just(10/x)
                  .onErrorResumeNext(resumeSequence)
                  .onExceptionResumeNext(resumeSequence)
          )

可以像这样重写:

 Observable.just(1,0,2,5)
      .flatMap(x -> {
                  int result = 10 / x;
                  return Observable.just(result)
                  .onErrorResumeNext(resumeSequence)
                  .onExceptionResumeNext(resumeSequence);
          })

所以它解释了你的&#34;主要&#34;感谢Observable运算符导致onExceptionResumeNext处于错误状态并完成,因为您的嵌套Observable永远不会被使用

您想要实现的是不完成observable然后发生错误。为此,您的嵌套Observable可以在主要Observable没有完成后立即完成。为此,您必须使用10 / x运算符推迟fromCallable的计算:

 Observable<Integer> resumeSequence = Observable.just(-1);       
 Observable.just(1,0,2,5)
      // 10 / x will be computed only when this nested observable will subscribe
      .flatMap(x -> Observable.fromCompletable(() -> 10/x)
                  .onErrorResumeNext(resumeSequence)
                  .onExceptionResumeNext(resumeSequence)
          )
      .onErrorResumeNext(resumeSequence)
      .onExceptionResumeNext(resumeSequence)
      .subscribe(System.out::println, 
                  throwable -> System.out.println("IN ERROR CALLBACK" + throwable));