RxJava / RxKotlin은 try-catch문을 사용할 수 없고 로그를 넣을 수 있는 공간이 없기 때문에 doOnXXX() 계열의 함수를 이용하여 강제로 부수 효과를 일으켜 디버깅(Debugging)처리를 합니다.
데이터가 발행되기 직전에 Notification<T.>을 통해 발행되는 데이터를 콜백 형태로 확인할 수 있도록 해줍니다.
doOnEach 사용 예시 코드
fun main {
Observable.just(1,2)
.doOnEach { notification ->
println("data : " + notification.value)
println("isOnNext : " + notification.isOnNext)
println("isOnComplete : " + notification.isOnComplete)
println("isOnError : " + notification.isOnError)
}
.subscribe(System.out::println)
}
data : 1
isOnNext : true
isOnComplete : false
isOnError : false
1
data : 2
isOnNext : true
isOnComplete : false
isOnError : false
2
data : null
isOnNext : false
isOnComplete : true
isOnError : false
doOnEach()문 앞에서 작성한 출력문들이 먼저 실행이 되고 onNext()를 통해 발행된 데이터들의 경우 isOnNext 프로퍼티가 true로 되어있습니다.
doOnNext()는 데이터가 발행되기 전에 디버깅을 도와주는데 doOnEach() 메서드와 달리 Notification<T.> 형식이 아닌 Observable의 Consumer 형태를 사용하게 됩니다.
fun main(){
Observable.just(10,5,0)
.doOnNext { item -> println("doOnNext() - $item") }
}
doOnNext() - 10
doOnNext() - 5
doOnNext() - 0
doOnSubscribe()는 어떠한 구독 주체가 해당 Observable을 구독하기 시작할 때 콜백을 받을 수 있게 해주는 연산자입니다. Disposable을 전달하기 때문에, dispose 관련 동작을 수행할 수 있습니다.
fun main() {
Observable.just(1,2,3)
.doOnSubscribe { it : Disposable -> if(it.isDisposed) println("Disposed!") else println("Subscribe Start")
}
.subscribe(System.out::println)
}
Subscribe Start
1
2
3
doOnComplete()의 경우 이름에서 유추할 수 있듯 Emitter 인터페이스가 onComplete()를 호출했을 때를 감지하여 콜백을 받을 수 있게 해주는 메서드입니다.
fun main() {
Observable.just(1,2,3)
.doOnComplete { println("Completed!") }
.subscribe(System.out::println)
}
1
2
3
Completed!
doOnError()의 경우 Emitter 인터페이스가 onError() 이벤트를 발생했을 때 호출됩니다. Observable이 오류가 발생하여 종료되기 직전에 실행 됩니다.
파라미터로는 Throwable이 제공됩니다.
예를 들어 map을 통해 데이터 스트림의 데이터들을 Int 자료형으로 변환 시키는 동작을 하다 정수형으로 변환 불가능한 데이터를 만났을 때의 오류 처리를 도와줍니다.
fun main() {
Observable.just("1","2","HeeTae","3","4")
.map { it.toInt() }
.doOnError { e: Throwable ->
println(e.toString())
}
.subscribe(System.out::println)
}
1
2
java.lang.NumberFormatException: For input string: "HeeTae"
doOnError()의 경우 에러 디버깅 용으로만 사용되는 것이기에 에러 처리는 별도로 해줘야합니다.
https://reactivex.io/documentation/operators.html#utility
https://velog.io/@haero_kim/RxJava-Observable-%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0
https://jaejong.tistory.com/84