LoginSignup
10
3

More than 5 years have passed since last update.

Rxは実装によって動きが違うのを意識しよう

Posted at

TL;DR

  • UniRx最近触りだした。
  • なんかちょいちょい思ってたのと違う動きがある
  • 他の言語と比較してみたらやっぱりちがうっぽいので、Reactive Streams標準化が待たれる

はじめに

最近UniRxを触りだしてLINQ式の書き方に四苦八苦しながら開発してたマンです。
実装の差異については、他の記事でも結構触れられてるので、そちらにおまかせするとして、
今回はonFinalyの実装の差異に付いて調べました。

RxJava2.0.8

        Observable.create<Int> { it.onComplete() }
                .doFinally { Log.d("hoge", "onFinally") }
                .doOnDispose { Log.d("hoge", "onDispose") }
                .subscribe(
                        { Log.d("hoge", "onNext") },
                        { Log.d("hoge", "onError") },
                        { Log.d("hoge", "onComplete") }
                )
                .dispose()
04-21 20:41:17.194 5151-5151/yashims85.me.prayground D/hoge: onComplete
04-21 20:41:17.194 5151-5151/yashims85.me.prayground D/hoge: onFinally

ちなみに、最初の一行をEmptyにすると、onCompletedの代わりにonDisposeが、
同じく、最初の一行でonErrorを発行すると、onCompletedの代わりにonErrorが出力されました。
つまり、

onFinally: (onCompleted || onError || onDispose) の後に実行される

UniRx

        Observable.Create<int>(it =>
            {
                it.OnCompleted();
                return Disposable.Create(() => Debug.Log("onDispose"));
            })
            .Finally(() => Debug.Log("onFinally"))
            .Subscribe(
                it => Debug.Log("onNext"),
                e => Debug.Log("onError"),
                () => Debug.Log("onComplete")
            )
            .Dispose();
04-21 21:29:57.841 25969 26045 I Unity   : onComplete
04-21 21:29:57.849 25969 26045 I Unity   : onDispose
04-21 21:29:57.856 25969 26045 I Unity   : onFinally

ちなみに、同じく、OnCompletedを発行している部分を消すと、onDispose onFinallyが出力され、
OnCompletedOnErrorに変えると、onError onDispose onFinally が出力されます。

つまり、

onFinally: onCompleted,onErrorは関係なく、 onDispose の後に実行される

まとめ

RxJava2.x系はReactive Streamsという標準化にそって開発を進めてるとのことで、そちらがよりデファクトと言えそうです。
しかし、UniRxはLINQの流れを汲んでおり、こちらもある意味では正当と言えそうです。

同じRxだからといって、油断してると思わぬ実装差分があったりするので注意した方が良さそうです。
そして、今後は各言語どういう実装方針にしていくのか気になるところです。

(名ばかりRxで、それぞれが独自実装していく方針だとしたら、Rx採用する利点激減だなぁという所感)

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3