gpt4 book ai didi

Angular 5 Interceptor - 仅在第一个拦截器重试失败后调用第二个拦截器

转载 作者:太空狗 更新时间:2023-10-29 17:51:26 28 4
gpt4 key购买 nike

我正在构建一个有 2 个拦截器的 angular 5 应用程序:

  • 重试失败的 504 请求
  • 另一个向用户显示有关失败请求的错误消息

我希望仅当错误不是 504 或错误为 504 并且已被第一个拦截器重试时才调用第二个拦截器。

我已经创建了一个包含两个拦截器的示例:https://stackblitz.com/edit/angular-interceptors-ckbvsb

希望得到一些帮助!

谢谢

更新:

感谢大家的帮助!我最终是这样实现的:

@Injectable()
export class I1 implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log('intercepted I1');

return next.handle(req)
.retryWhen(error => {
return error
.mergeMap((err, i) => {
if (i > 0) return Observable.throw(err)
if (err instanceof HttpErrorResponse && err.status === 504) { // timeout
return Observable.of(err).delay(5000);
} else {
return Observable.throw({ error: 'No retry', cause: err })
}
})
});
}
}

最佳答案

您的问题是您提供两个拦截器的顺序。您首先提供 I1,然后提供 I2。这意味着请求将流经 I1 → I2,但响应 将流经 I2,然后才流经 I1。所以只需调换顺序:

@NgModule({
imports: [BrowserModule, HttpClientModule],
declarations: [AppComponent],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: I2, // <-- I2 first
multi: true
},
{
provide: HTTP_INTERCEPTORS,
useClass: I1, // <-- And only then I1
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule {
}

关于Angular 5 Interceptor - 仅在第一个拦截器重试失败后调用第二个拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48865398/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com