我有一个angular 6应用程序,配置为在失败时重试http请求3次.

有没有办法做到这一点?

我在RxJs文档中找不到任何答案.

谢谢你的帮助

这是我的代码:

@Injectable()
export class RetryInterceptor implements HttpInterceptor {
    constructor( public spinnerService: NgxSpinnerService ) { }   
   
    timer: any;
    intercept(req: HttpRequest<any>, next: HttpHandler):
        Observable<HttpEvent<any>> {
         
            if(this.timer){
                clearTimeout(this.timer);
              }
              this.timer = setTimeout(() =>  this.spinnerService.show(), 500);           

            let handleObs: Observable<HttpEvent<any>> = next.handle(req)
            .pipe(                                        
                 retry(3),
                 finalize(() =>{
                    this.spinnerService.hide();
                    if(this.timer){
                        clearTimeout(this.timer);
                      }
                 }
                 )             
            );          

        return  handleObs;
    };
}

推荐答案

首先,您必须创建一个函数,我们将在其中创建一个HTTP headers对象,并添加一个自定义头字段(键:值对).可以在我们的API调用中向该标头传递一个附加参数.我们可以在拦截器中使用头部,并且可以编写自己的逻辑.

 export function retryCall() {
      let headers = new HttpHeaders();
      headers = headers.set('retryCall', 'true');
      return { headers: headers };
    }

在公用文件中添加上述函数.

intercept(
    request: HttpRequest<unknown>,
    next: HttpHandler
  ): Observable<HttpEvent<unknown>> {
    let isretry = request.headers.get('retryCall');
    let count = 0;
    return next.handle(request).pipe(
      tap((s) => console.log(count++)),
      retry(isretry ? this.retryCount : 0)
    );

在拦截器文件中,访问标头并使用ternational操作符使用retry操作符.

this.httpService.getAPIWithError(2, retryCall()).subscribe((data) => {
      console.log('data: ', data);
    });

在代码中传递如上所述的retryCall函数.这是一个可选参数.

 getAPIWithError(id: number, headers?: any) {
    return this.httpClient.get(
      `https://jsonplaceholder.typicode.com/todos/2/${id}`,
      headers
    );
  }

如果您需要代码,可以查看以下链接.

https://stackblitz.com/edit/angular-retry-rxjs-interceptor?file=src%2Fapp%2Fapp.module.ts,src%2Fapp%2Fhttp-service.ts,src%2Fapp%2Fretry-interceptor.interceptor.ts,src%2Fapp%2Fapp.component.ts,src%2Fapp%2Fapp.component.html

如果你想了解我的代码,可以查看我的中间文章.

Angular相关问答推荐

嵌套formArrays的HTML迭代

Angular 17自定义指令渲染不起作用'

间歇性不正确的SSR重定向(server. ts级别的请求和响应不匹配)

有没有一种方法用timeout()操作符创建计数器,用于超时一个观察对象?

在Angular 多选下拉菜单中实现CDK拖放排序的问题

如何使用带有17角的Swiper 11.0.5元素

当在server.ts文件中定义API路径时,Angular 17构建失败

Ngrx Select 器返回部分对象

MonoTypeOperatorFunction不可分配给OperatorFunction类型的参数

URL 更改但组件未在 Angular 导航中呈现

Angular APP_INITIALIZER 中的 MSAL 身份验证

错误:在工作区外运行 Angular CLI 时,此命令不可用

无法将项目从 Angular 13 更新到 14

Angular combinelatest使用没有初始值的主题

使用 rxjs 处理刷新令牌

带有嵌套表单数组的 Angular react式表单

Angular Material 模态对话框周围的空白

Angular 4中的md-select中的onselected事件

如何使用formControlName和处理嵌套的formGroup?

Angular2:CoreModule 与 SharedModule