2016-12-05 12 views
2

私はretryWhenを理解するのに苦労しています。RxJava - retryWhen - 再試行可否エラー

私のユースケースは以下の通りである。私はエラーが私が実行したいが発生した場合

  • 観察できる主なものを持っている

    • 異なる場合は
    • の間で(も異なる結果を有する)観測可能この2番目の観測可能な成功は、元の再実行したい 一度再試行中にエラーが発生した場合、私は追加の再試行をしたくない
    • 観察できるこの第二が成功しなかった場合、私はメインに観察

    私はこれをどのように行うのですかの加入者に エラーを伝播したいですか?

    ありがとうございました!


    私がこれまで試したどのようなUPDATE

    public class RetryTest { 
    
        private int i = 0; 
    
        @Test 
        public void testRetry() { 
         Observable 
           .create((Observable.OnSubscribe<String>) subscriber -> { 
            if (i == 0) { 
             i++; 
             throw new RuntimeException("Main error"); 
            } else { 
             subscriber.onNext("Main success"); 
             subscriber.onCompleted(); 
            } 
           }) 
           .retryWhen(observable -> { 
    
            // HERE IS WHERE I NEED HELP, i need something like: 
    
            Observable.just("Error handling observable") 
              .subscribe(new Subscriber<String>() { 
    
               @Override 
               public void onCompleted() { 
                // Do retry ONCE 
               } 
    
               @Override 
               public void onError(Throwable e) { 
                // Propagate error 
               } 
    
               @Override 
               public void onNext(String s) { 
                // Nothing to do here 
               } 
              }); 
           }) 
           .subscribe(new Subscriber<String>() { 
            @Override 
            public void onCompleted() { 
             System.out.println("onCompleted"); 
            } 
    
            @Override 
            public void onError(Throwable e) { 
             System.out.println("onError: " + e); 
            } 
    
            @Override 
            public void onNext(String s) { 
             System.out.println("onNext: " + s); 
            } 
           }); 
        } 
    } 
    
  • +0

    何を試しましたか? (私が意味する最小限の例を共有して、あなたがそれを持っている問題を説明してください) – Ivan

    +0

    私が試したものの例と、どこに止まっているのかの例を追加しました。 – JDC

    答えて

    0

    simplierソリューションがあります。あなたのケースでは、あなたは、retryWhenオペレータを必要とする代わりにonErrorResumeNextを使用しないでください:

    Observable mainObservable = Observable.just("Your main Observable"); 
    Observable secondObservable = Observable.just("Your second Observable"); 
    
    mainObservable 
         .onErrorResumeNext(o1 -> secondObservable.flatMap(o2 -> mainObservable)) 
         .subscribe(); 
    

    ここonErrorResumeNextエラーをインターセプトし、第二観測を行い、観測可能なメイン。エラー がある場合、下流に伝播します。すべてあなたの基準に合っています。

    +0

    好奇心をそらして: 'onErrorResumeNext'のような、オリジナルのobservableをパラメータとして持つメソッドがありますか?私は、これを別のクラス/メソッドで、元の観測値を渡す必要なしに外部化したいと思います。 – JDC

    +0

    あなたは 'compose()'を使うことができます。 –

    関連する問題