retryWhenについて
RxJSのretryWhen
の用途としては、AngularでいえばHttpClientで特定のステータスコード返却時のみリクエストをリトライしたい場合にインターセプターに組み込むケースなどがあります。
しかしretryWhen
はDeprecatedになっておりv9かv10で削除されるとのことで、代わりにretry
オペレーターのdelay
オプションを使うことが推奨されています。
retryとdelayについて
retry
とdelay
を使用した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を引数に取ります。
RetryConfig
のdelay
プロパティの定義は以下のようになっています。
delay?: number | ((error: any, retryCount: number) => ObservableInput<any>);
単純にnumber
(ミリ秒)が与えられた場合はその分遅延した後リトライとなります。関数が与えられた場合、Observableを返せばリトライされます(上記サンプルのreturn timer(100 * retryCount)
の部分。)し、エラーを返せばリトライされずにエラーとなります。この関数部分で条件を記述することで条件付きリトライを実現できます。
まとめ
冒頭のようなケースにおいてまだまだretryWhen
を使った書き方の情報が多いため、Deprecated対応の参考になれば嬉しいです。