🐈
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