LoginSignup
0
0

[RxJS/Angular]retryWhenはDeprecatedなので代わりにretryとdelayを使う

Posted at

retryWhenについて

RxJSのretryWhenの用途としては、AngularでいえばHttpClientで特定のステータスコード返却時のみリクエストをリトライしたい場合にインターセプターに組み込むケースなどがあります。
しかしretryWhenはDeprecatedになっておりv9かv10で削除されるとのことで、代わりにretryオペレーターのdelayオプションを使うことが推奨されています。

retryとdelayについて

retrydelayを使用したHttpInterceptorFnの書き方サンプルです。ステータスコードが500の時のみ10回までリトライされ、それ以外は即時エラーを返します。

export const responseInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next: HttpHandlerFn) => {
  return next(req).pipe(
    retry({
      count: 10,
      delay: (error, retryCount) => {
        if (error.status === 500) {
          // リトライの度に100ミリ秒増やした遅延後にリトライ
          return timer(100 * retryCount);
        } else {
          // 500以外はエラー
          return throwError(() => error);
        }
      }
    })
  );
};

retryオペレーターはRetryConfigを引数に取ります。
RetryConfigdelayプロパティの定義は以下のようになっています。
delay?: number | ((error: any, retryCount: number) => ObservableInput<any>);
単純にnumber(ミリ秒)が与えられた場合はその分遅延した後リトライとなります。関数が与えられた場合、Observableを返せばリトライされます(上記サンプルのreturn timer(100 * retryCount)の部分。)し、エラーを返せばリトライされずにエラーとなります。この関数部分で条件を記述することで条件付きリトライを実現できます。

まとめ

冒頭のようなケースにおいてまだまだretryWhenを使った書き方の情報が多いため、Deprecated対応の参考になれば嬉しいです。

0
0
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
0
0