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
が出力され、
OnCompleted
をOnError
に変えると、onError
onDispose
onFinally
が出力されます。
つまり、
onFinally: onCompleted,onErrorは関係なく、 onDispose の後に実行される
まとめ
RxJava2.x系はReactive Streamsという標準化にそって開発を進めてるとのことで、そちらがよりデファクトと言えそうです。
しかし、UniRxはLINQの流れを汲んでおり、こちらもある意味では正当と言えそうです。
同じRxだからといって、油断してると思わぬ実装差分があったりするので注意した方が良さそうです。
そして、今後は各言語どういう実装方針にしていくのか気になるところです。
(名ばかりRxで、それぞれが独自実装していく方針だとしたら、Rx採用する利点激減だなぁという所感)