2016-07-25 6 views
2

ここに問題があります。私は結果がさらに処理される単一のものに集約されるいくつかの非同期操作を持っています。ただし、すべての操作が等しいわけではなく、エラー処理は、どの操作が失敗するかに基づいて異なります。優先度の高いRxJavaジップ

A、B、Cの操作があるとしましょう.Aが失敗した場合は処理を終了する必要がありますが、BまたはCが失敗した場合は他の処理を引き続き正常に処理します。

現在のところ、カウントダウンラッチと数百のコード行に近い多くの状態管理を使用してこれを実現しています。私はこれをRxJavaベースの実装に移したいと思います。私の最初の考えはObservable.zip演算子を試していましたが、それはすべての観測値を等しく扱います。この場合はそうではありません。私の他のアイデアは、通話を連鎖させることでしたが、それはすべての操作が同時に開始されず、全体的な時間が長くなることを意味します。

これを達成する方法を教えてくれる人は誰ですか?

答えて

3

使用.onErrorResumeNextnullでエラーが発生した観測を表現

Observable<T> a, b, c; 
Observable.zip(
    a, 
    b.onErrorResumeNext(t -> Observable.just(null)), 
    c.onErrorResumeNext(t -> Observable.just(null)), 
    (x, y, z) -> <your aggregation>) 
... 

はあなた次第です。またOptionalを使用することができます。

Observable.zip(
    a, 
    b.map(x -> Optional.of(x)) 
    .onErrorResumeNext(t -> Observable.just(Optional.empty())), 
    c.map(x -> Optional.of(x)) 
    .onErrorResumeNext(t -> Observable.just(Optional.empty())), 
    (x, y, z) -> <your aggregation>) 

b場合とcは、外部サービスに対応して、あなたも、彼らはb.timeout(5, TimeUnit.SECONDS)bを置き換えることにより、時間がかかりすぎる場合は、それらを無視することができます呼び出します。簡潔にええ!

+0

簡潔に、確かに。リファクタのコミットメッセージは、「140行のコードを38に変更する方法」です。 –

関連する問題