LoginSignup
0

More than 3 years have passed since last update.

UniRxのOnErrorRetryでdelayをだんだんと長くしていく

Last updated at Posted at 2019-11-21

UniRxのOnErrorRetryのディレイを任意の値に切り替える実装です。
APIリクエストの実装などでディレイをだんだんと長くしたいときに利用してます。
例ではフィボナッチを使っていますが、任意の実装に置き換えて使えると思います。
また、一定回数を超えると Observable.Throw<T>(ex) を返していますが、そこでリトライは終了し、streamは OnError を呼んで終了します。

using System;
using UniRx;
using UnityEngine;

public static class ObservableExtensions {

    private static readonly float[] incrementalDelaySeconds = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};

    public static IObservable<T> OnErrorRetryWithIncrementalDelay<T>(this IObservable<T> observable) {
        return Observable.Defer(() => {
            var count = 0;
            IObservable<T> self = null;
            self = observable.Catch((Exception ex) => {
                Debug.LogException(ex);
                count++;
                return count < incrementalDelaySeconds.Length
                    ? self.DelaySubscription(TimeSpan.FromSeconds(incrementalDelaySeconds[count]))
                        .SubscribeOn(Scheduler.CurrentThread)
                    : Observable.Throw<T>(ex);
            });
            return self;
        });
    }
}

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
0