2017-08-16 9 views
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. 

それだけ、このようなflatMaponErrorReturn設定した場合は動作します:

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

しかし、私はチェーン内のエラー情報を失います。どのように私はストリームを生きて維持し、優雅に終了を抑制することができますか?

+0

2番目のケースでどのエラー情報を失っていますか?私が理解しているものから、最初のものは最初の試行で終了し、2番目のものはエラーのある5つのアイテムを出して終了します。 – masp

答えて

0

正確に何をしたいかによって異なります。 1つの方法は、エラーと成功の値をTryのようなものにflatMapの中にマップし、それを外側のObservableに処理することです。

もう1つの方法は、エラーを.flatMap(function, true)で遅延させることです。その後、ストリームは完了するまで有効になり、正常な値を処理できるようになり、最後に複合エラーが通知されます。

関連する問題