通过检查请求是否为重试请求来避免重复调用。在实现Angular Interceptor时,我们可以添加一个自定义标头来指示请求是否为重试请求。
以下是示例代码:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { mergeMap, catchError } from 'rxjs/operators';
@Injectable()
export class RetryInterceptor implements HttpInterceptor {
private isRetryRequest(request: HttpRequest): boolean {
const isRetry = request.headers.get('retry-request');
return isRetry ? true : false;
}
intercept(request: HttpRequest, next: HttpHandler): Observable> {
return next.handle(request).pipe(
catchError((error) => {
if (error.status === 500 && !this.isRetryRequest(request)) {
// add retry header to request
const retryRequest = request.clone({
headers: request.headers.set('retry-request', 'true')
});
// retry the request
return next.handle(retryRequest);
}
return throwError(error);
})
);
}
}
在上面的代码示例中,我们在拦截器中添加了一个isRetryRequest
方法来检查请求是否为重试请求。如果是重试请求,则不再重试,直接抛出错误。否则,将重试标头添加到请求中并重试请求。这样可以避免重复调用导致的问题。
下一篇:Angular2表单