• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

map에서의 TimeUtil.sleep에 관한 궁금점

22.10.05 22:45 작성 조회수 122

0

안녕하세요. 예제 코드를 이것저것 바꿔가며 실행해보다가 궁금한 점이 있어서 질문드립니다.

Observable.range(1, 5)
        .doOnNext(data -> Logger.log(LogType.DO_ON_NEXT, data))
        .map(num -> {
            long time = 1000L;
            if(num == 4){
                time = 1500L;
            }
            TimeUtil.sleep(time);
            return num;
        })
        .timeout(1200L, TimeUnit.MILLISECONDS)
        .subscribe(
                data -> Logger.log(LogType.ON_NEXT, data),
                error -> Logger.log(LogType.ON_ERROR, error)
        );

doOnNext() | main | 22:42:06.634 | 1
onNext() | main | 22:42:07.636 | 1
doOnNext() | main | 22:42:07.636 | 2
onNext() | main | 22:42:08.636 | 2
doOnNext() | main | 22:42:08.636 | 3
onNext() | main | 22:42:09.637 | 3
doOnNext() | main | 22:42:09.637 | 4
onERROR() | RxComputationThreadPool-1 | 22:42:10.837 | java.util.concurrent.TimeoutException: The source did not signal an event for 1200 milliseconds and has been terminated.

위와 같이 코드를 작성하였을때 원본 데이터가 delay함수의 유형2번과 유사하게 동작해서 LogType doOnNext와 doNext가 번갈아 가면서 출력되었습니다.

range()에서 생성된 데이터가 map으로 들어가기 까지는 delay가 없어서 doOnNext가 4번 찍히고 delay 이후에 onNext가 4번찍힐 것으로 예상했는데 번갈아가면서 찍히는 이유가 무엇인가요??

답변 1

답변을 작성해보세요.

1

안녕하세요? 질문자님이 올려주신 소스코드 대로라면

doOnNext와 onNext가 번갈아 가면서 출력되는게 정상입니다.

이유는,

range()에서 1을 내보내면 doOnNext()에서 1을 출력하고, 다음 step으로 map에서 1초의 딜레이 타임을 가진 후에 Subscriber에게 전달이 되기 때문에 Subscriber 쪽의 onNext에서 1이 출력됩니다.

 

range()에서 내보내진 2, 3도 같은 과정을 거쳐서 doOnNext와 onNext가 번갈아 출력되고 range()에서 4가 내보내지면 doOnNext()에서 4가 출력된 후에 map()에서 1.5초가 딜레이되므로 TimeoutException이 발생합니다.

doOnNext()에서 1부터 4까지 모두 출력된 후에 map()으로 넘어가는게 아니라 원본 Publisher에서 데이터 하나가 내보내지고 중간에 여러 연산자 함수를 거쳐서 Subscriber까지 전달되는 과정이 데이터 하나에 대한 처리 과정이라고 생각하시면 될 것 같아요.

질문에 대한 답이 되셨으면 좋겠습니다.

다른 질문 있으시면 또 편하게 질문 남겨주시면 감사드릴게요.