🐈
RxJava2のSingles.zipの罠
RxJava2 でコードを書いていると「複数の API を並列実行して結果を合成したい」といった場面があります。
こうした時、 Single.zip
や RxKotlin の拡張である Singles.zip
を使って Stream を合成したくなります。
しかしこの実装には罠があります。それはどういったものか?というと
合成対象になる Stream のうちどれか一つでもエラーが起きると、合成後の Stream にエラーが流れてしまい未完了の Stream の完了を待たずに合成後の Stream が Dispose されてしまう。
結果としてエラー発生後に完了した Stream の結果を送出することができずに UndeliverableException
が発生してしまう。
というものです。
RxJava2 をよくご存知の方でしたら、 merge なら mergeDelayError
があるんだけどなと気づくかと思いますが、残念ながら zip には zipDelayError
のような operator は存在しません。
存在しないなら作ってしまおうということで書いたコードがこちらです。
こんな感じで
-
mergeDelayError
を使ってエラーを遅延させる -
scan
でリストに型変換する - 順不同で流れてくる各 Stream の結果をソートして本来の順序に並べ替える
といったことをしてあげれば問題を解決することができます。
Discussion