非同期プログラミングにて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使えば、↑の同期処理のときみたいにかけて幸せになりそう。