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;
});
}
}