はじめに
UniRx
を使っていたところ、PeactiveProperty
をawait
したらどうなるか気になりました。
そこで今回は実験していきたいと思います。
ReactivePropertyをawaitする
結論からいうと、awaitした後からReactivePropertyの値が変わるまで待ちます。
private async void Start() { var reactiveProperty = new ReactiveProperty<int>(0); // 1, 2, 3と値が変わっていく UniTask.Void(async () => { await UniTask.DelayFrame(2); reactiveProperty.Value = 1; await UniTask.DelayFrame(2); reactiveProperty.Value = 2; await UniTask.DelayFrame(3); reactiveProperty.Value = 3; }); // awaitした瞬間からreactivePropertyが変わるまで待つ await reactiveProperty; Debug.Log(reactiveProperty.Value); // 1 await UniTask.DelayFrame(3); await reactiveProperty; Debug.Log(reactiveProperty.Value); // 3 }
ちなみにReactiveProperty.Dispose()
した後にawait reactiveProperty
をするとTaskCanceledException
が投げられるみたいです。
Observableをawaitする
おまけですが、Observable
をawait
をするとOnCompleted
が発火されるまで待ちます。
private async void Start() { var subject = new Subject<int>(); var disposable = subject.Subscribe(x => Debug.Log(x)); UniTask.Void(async () => { // OnNextしたとしてもawaitは抜けない await UniTask.Yield(); subject.OnNext(1); await UniTask.Yield(); subject.OnNext(2); await UniTask.Yield(); subject.OnNext(3); // OnCompletedしたらawait subjectを抜ける subject.OnCompleted(); }); await subject; // 1, 2, 3, await終わりの順番で出力されている Debug.Log("await終わり"); disposable.Dispose(); }
さいごに
ReactiveProperty
をawait
すると次の値まで待つってのはかなり役に立ちそうですよね。
またReactiveProperty
のUniTask
版であるAsyncReactiveProperty
というのもあるので、そちらも後で紹介できたらと考えてます。
ではまた。