我是RxJava的新手,並嘗試將我的頭包裹在一個更復雜的登錄邏輯中,該登錄邏輯有三個異步方法進行處理。對我來說,這是「如果我得到這個東西轉化爲RxJava,任何東西(tm)是可能的」 :)RxJava流:有條件的運算符和錯誤處理
所以我想要做的是以下幾點:
Call A -> (Process A) -> Call B with results of A -> (Process B) -\
\ -> Combine and Subscribe
\-> Call C with results of A -> (Process C) -/
現在的問題是, Call C
分支只能在特定條件下執行,否則不能(Combine and Subscribe
然後可以從該分支接收到NULL
值,這是可以的)。
而且,錯誤處理是不平凡:雖然Call A
和Call C
(如果運行的話)需要通過onError
提供他們的錯誤給最終用戶,Call B
的‘成功’是寧可選的,可以忽略不計在失敗的情況下。
這是我想出了這麼遠,而忽略了「C」分支還是:
mApi.callA(someArgs)
// a transition operator to apply thread schedulers
.compose(applySchedulers())
// from rxlifecycle-components, unsubscribes automatically
// when the activity goes down
.compose(bindToLifecycle())
// possibly other transformations that should work on the (error)
// states of the first and the following, chained API calls
.flatMap(response -> processA(response))
.flatMap(response -> mApi.callB(response.token))
.flatMap(response -> processB(response))
// redirects HTTP responses >= 300 to onError()
.lift(new SequenceOperators.HttpErrorOperator<>())
// checks for application-specific error payload and redirects that to onError()
.lift(new SequenceOperators.ApiErrorOperator<>())
.subscribe(this::allDone this::failure);
我看了看周圍的Wiki for conditional operators,但我不能找到一個提示如何開球Call C
科。另外,我不確定我的SequenceOperators
是否可以按照這種方式工作,也就是說可以放在鏈中的所有請求之後,還是我需要其中的幾個,每個放置在觸發新的flatMap()運算符後的中間Call
。
有人能指出我正確的方向嗎?
謝謝!
好了,瞭解,現在在哪裏我不確定是我該怎麼辦,然後錯誤處理。我想有一些運算符/組件/無論我扔在那裏,並一般行爲上的任何響應(因此'HttpErrorOperator'和'ApiErrorOperator')。另外,你在G +上說過渡操作員應該走最後一步(即「撰寫」) - 我認爲我必須在這裏處理「溫度」,而不是我偶然地將一個「冷」可觀察的「熱」對? –
如果callB和callC都需要,那麼簡單的解決方法是在它們兩個上調用.lift。 –
否則,如果callB和callC都發出相同類型,則可以使用Observable.merge(callB,callC).lift(..)。toList()。map(rarb - > combineAplusB(rarb.get(0),rarb。 get(1)); –