非同期プログラミングにてRxを使って思ったメモ

サーバーサイドの非同期呼び出しを含む処理を簡潔に書くためにRxJavaを使用していて、もっとうまくやれたらなと思うところが見つかったのでメモ。 ざっくり書くと early returnみたいなことがRxJavaだとやりにくいなと思った。

DBやAPIの呼び出しが同期呼び出しだったらこんな感じで書きたい処理も

// DBからなにか取ってくる
value = xxRepository.find()

// 空だったら NOT_FOUND返す
if value is null
   return NOT_FOUND

// サポートされてない値だったら NOT_SUPPORTEDを返す
if value.getX() == ppp
   return NOT_SUPPORTED

// API呼ぶ
response = xxClient.call(value)

// レスポンスが失敗だったらエラーを返す
if response is not success
  return ERROR

// 成功したら記録する
yyRepository.save()

return OK

非同期だとそうもいかないので、こんな感じで今は書いていて、nestが深かったり、本来は最初の値が取れない時点でreturnしたいのに結局最後にその分岐の処理を書いていたりしていてイマイチだなとおもっている。

// DBからなにか取ってくる
xxRepository.find()
.flatMapSingleElement(value -> {
   // サポートされてない値だったら NOT_SUPPORTEDを返す
   if value.getX() == ppp
       return NOT_SUPPORTED
   // API呼ぶ
   return xxClient.call(value)
        .flatMap(response -> {
                // レスポンスが失敗だったらエラーを返す
                if response is not success
                     return ERROR
               // 成功したら記録する
               yyRepository.save()
               return OK
        })
// 空だったら NOT_FOUND返す
}).toSingle(NOT_FOUND)

Coroutine使えば、↑の同期処理のときみたいにかけて幸せになりそう。