下流上流にサブスクライブする前にdoOnSubscribe
を呼び出すために、コード印刷1、RxJava1、2つのコードの印刷の両方において2RxJava2 doOnSubscribeが混乱した順序で実行されるのはなぜですか?
Observable.just(1)
.doOnSubscribe(d -> System.out.println(1))
.doOnSubscribe(d -> System.out.println(2))
.blockingSubscribe();
そして、この印刷2,1
Observable.just(1)
.doOnSubscribe(d -> System.out.println(1))
.subscribeOn(Schedulers.newThread())
.doOnSubscribe(d -> System.out.println(2))
.blockingSubscribe();
"2,1" を後。
RxJava2では、サブスクリプションの前にアップストリームからダウンストリーム(Observer.onSubscribe
)のサブスクリプションが発生しますが、まだdoOnSubscribe
が呼び出されています。だから混乱した命令が発生した。
でも、私はもっと混乱し、状況与えることができます:私が期待したが、ほとんどのは期待できないとして、それは "3、4、1、2を" 印刷
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();
を。
この動作は仕様ですか?はいの場合、どのようなメリットがありますか?タイムアウト前に高価な準備をしている非同期ソースを考える -
ええ、なぜそれが起こったのか分かります。私の質問は、なぜRxJava2はRxJava1のようにdoOnSubscribeを呼び出すことで、下流にサブスクライブした後には呼び出されないということです。もっと合理的な '4,3,2,1'を得ることができるように。 –
RxJava 1には 'onSubscribe'がなく、' subscribe'が呼び出されたときに実行コードに制限されていました。 RxJava 2の主な目標は、v1のアーキテクチャ上および論理上の間違いを修正し、完全なバージョンのバンプにすることです。バイナリ互換性のない方法で行います。 – akarnokd
ありがとうございます。私はあなたがこれが設計によるものであると言いたいのですか?私は 'doOnSubscribe'を使用して、おそらくオペレータを注文して購読注文によってその行動を行うように注意します。 –