2017-05-09 6 views
1

RxJava2を使用して、私はいくつかのタイムイベントを達成しようとしています。RxJavaタイマーとタイムアウトを含むネストされたサブスクリプション

1秒未満で完了する非同期イベントがいくつかありますが、非同期操作の結果を続ける前に、少なくとも1秒間ユーザーにメッセージを表示したいその結果は後になります)。

非同期操作もタイムアウトする可能性があります。メッセージを表示して続行しないとします。

zip()を最初のパラメータとして使用し、async操作を2番目の演算子として使用してこれを達成できますが、次の「レイヤー」では何をしますか?

これは私が実際にに動作しており、これまでのところありますが、私は(非同期操作の代わりにjust()を使用して、サブスクリプションのスレッドを無視して)ネストされたサブスクリプションの作成に非常に汚い感じのコード

mStringsですちょうどBehaviorSubject<String>です。

mStrings.onNext("Waiting 1 second. The result will fire at the Single.timer onComplete"); 
Single.zip(Single.timer(1, TimeUnit.SECONDS), Single.just("First"), (t1, t2) -> t2) 
    .timeout(15, TimeUnit.SECONDS, observer -> { 
     mStrings.onNext("First timeout fired"); 
    }) 
    .subscribe(s1 -> { 
     mStrings.onNext("First timer fired and returned " + s1); 
     Single.zip(Single.timer(1, TimeUnit.SECONDS), Single.just("Second"), (t1, t2) -> t2) 
     .timeout(15, TimeUnit.SECONDS, observer -> { 
      mStrings.onNext("Second timeout fired"); 
     }) 
     .subscribe(s2 -> { 
      mStrings.onNext("Second timer fired and returned " + s2 + ". Previous was " + s1); 
      Single.zip(Single.timer(1, TimeUnit.SECONDS), Single.just("Third"), (t1, t2) -> t2) 
       .timeout(15, TimeUnit.SECONDS, observer -> { 
        mStrings.onNext("Third timeout fired"); 
       }) 
       .subscribe(s3 -> { 
        mStrings.onNext("Third timer fired and returned " + s3 + ". Previous was " + s1 + " and " + s2); 
       }); 
     }); 
    }); 

あり、その結果:

17:53:53.219 Waiting 1 second. The result will fire at the Single.timer onComplete 
17:53:54.220 First timer fired and returned First 
17:53:55.224 Second timer fired and returned Second. Previous was First 
17:53:56.224 Third timer fired and returned Third. Previous was First and Second 

私は流れのこのタイプでは理にかなってオペレータ足りませんか?またはいくつかの基本的な方法論?私は、複数の科目を使って別の解決法を試すことができるかもしれないが、それは過剰なようだ。

+0

なので、1秒ごとに非同期操作を開始し、1秒ごとにステータスメッセージを表示すると、以前の非同期操作結果がすべて出力されますか? 1秒後にasycnの結果が返ってきたらどうなりますか? – yosriz

答えて

0

私は自分の問題を解決したと思います。 flatMapを使用すると、すべてのサブスクリプションを1つにまとめることができ、各個人timertimeoutは引き続き期待どおりに動作します。

mStrings.onNext("Waiting 1 second. The result will fire at the Single.timer onComplete"); 
Single.zip(Single.timer(1, TimeUnit.SECONDS), Single.just("First"), (t1, t2) -> t2) 
    .timeout(2, TimeUnit.SECONDS, observer -> { 
     mStrings.onNext("First timeout fired"); 
    }) 
    .flatMap(s1 -> { 
     mStrings.onNext("First timer fired and returned " + s1); 
     return Single.zip(Single.timer(1, TimeUnit.SECONDS), Single.just("Second"), (t1, t2) -> t2) 
     .timeout(15, TimeUnit.SECONDS, observer -> { 
      mStrings.onNext("Second timeout fired"); 
     }) 
     .flatMap(s2 -> { 
      mStrings.onNext("Second timer fired and returned " + s2 + ". Previous was " + s1); 
      return Single.zip(Single.timer(1, TimeUnit.SECONDS), Single.just("Third"), (t1, t2) -> t2) 
       .timeout(15, TimeUnit.SECONDS, observer -> { 
        mStrings.onNext("Third timeout fired"); 
       }) 
       .flatMap(s3 -> { 
        mStrings.onNext("Third timer fired and returned " + s3 + ". Previous was " + s1 + " and " + s2); 
        return Single.just("Fourth"); 
       }); 
     }); 
    }) 
    .subscribe(s -> { 
     // ignored 
    }); 
})); 

オブザーバブルを少し論理的に構成することで、複雑なネストを簡単にすることができます。

関連する問題