🐈

RxJava2のSingles.zipの罠

2021/07/27に公開

RxJava2 でコードを書いていると「複数の API を並列実行して結果を合成したい」といった場面があります。
こうした時、 Single.zip や RxKotlin の拡張である Singles.zip を使って Stream を合成したくなります。
しかしこの実装には罠があります。それはどういったものか?というと

合成対象になる Stream のうちどれか一つでもエラーが起きると、合成後の Stream にエラーが流れてしまい未完了の Stream の完了を待たずに合成後の Stream が Dispose されてしまう。
結果としてエラー発生後に完了した Stream の結果を送出することができずに UndeliverableException が発生してしまう。

というものです。
RxJava2 をよくご存知の方でしたら、 merge なら mergeDelayError があるんだけどなと気づくかと思いますが、残念ながら zip には zipDelayError のような operator は存在しません。

存在しないなら作ってしまおうということで書いたコードがこちらです。

こんな感じで

  1. mergeDelayError を使ってエラーを遅延させる
  2. scan でリストに型変換する
  3. 順不同で流れてくる各 Stream の結果をソートして本来の順序に並べ替える

といったことをしてあげれば問題を解決することができます。

Discussion