2017-10-31 6 views
0

, 2왜 RxJava2 doOnSubscribe가 혼란스러운 순서로 실행됩니까? 코드를 인쇄 한 다음

Observable.just(1) 
    .doOnSubscribe(d -> System.out.println(1)) 
    .doOnSubscribe(d -> System.out.println(2)) 
    .blockingSubscribe(); 

그리고이 인쇄 2, RxJava1에서 1

Observable.just(1) 
    .doOnSubscribe(d -> System.out.println(1)) 
    .subscribeOn(Schedulers.newThread()) 
    .doOnSubscribe(d -> System.out.println(2)) 
    .blockingSubscribe(); 

, 두 개의 코드 인쇄 "2, 1"모두 하류가 상류에 가입하기 전에 doOnSubscribe 호출하기 때문에 .

RxJava2에서 구독은 업스트림에서 다운 스트림 (Observer.onSubscribe)에서 발생하지만 구독 전에 여전히 doOnSubscribe이 호출됩니다. 그래서 혼란스러운 질서가 생겼습니다.

Observable.just(1) 
    .doOnSubscribe(d -> System.out.println(1)) 
    .doOnSubscribe(d -> System.out.println(2)) 
    .subscribeOn(Schedulers.newThread()) 
    .doOnSubscribe(d -> System.out.println(3)) 
    .doOnSubscribe(d -> System.out.println(4)) 
    .blockingSubscribe(); 

그것은 "3, 4, 1, 2"내 예상으로는 아니지만이 가장 예정되어 인쇄 :

심지어 나는 더 혼란 상황을 제공 할 수 있습니다.

이것은 의도적으로 설계된 동작입니까? 그렇다면 이점은 무엇입니까? 시간이 초과되기 전에 고가의 준비를하고있다 비동기 소스를 생각 -

답변

1

subscribeOn가 지정된 스레드 만 취소를 지원하기 위해 체인을 새 구독을 시작, 먼저 초기에 취소 할 수있는 DisposableonSubscribe를 호출 할 수있다 onSubscribe으로 전화합니다. 이론 상으로는 3, 4, 1, 2 사이에서 모든 종류의 인터리빙을 할 수도 있습니다.

+0

그래, 왜 그런지 알 겠어. 내 질문에 왜 RxJava2 RxJava1 doOnSubscribe 호출 하향식 가입 후 호출되지 않습니다. 더 합리적인 '4,3,2,1'을 얻을 수 있습니다. –

+0

RxJava 1에는'onSubscribe'가 없었고'subscribe'가 호출되었을 때 실행 코드로 제한되었습니다. RxJava 2의 주요 목표는 v1의 아키텍처 및 논리적 실수를 수정하고 정식 버전 충돌이되는 것이므로 바이너리 호환되지 않는 방식으로 수행하십시오. – akarnokd

+0

고맙습니다. 내가 원하는 건 디자인에 의한 것인지 아닌지 말야. 나는'doOnSubscribe'와 어쩌면 커스텀 연산자를 사용하여 구독 순서에 따라 액션을 수행하도록주의 할 것입니다. –