我有一个拦截器,可以处理错误,但是我想用undefined替换404错误,以确保我的订阅仍然激活。这将使我能够使用可观察的组合运算符,其中可以预期流404并具有含义。这是我的拦截器:
@Injectable() 导出类WebApiHttpInterceptor实现HttpInterceptor {
constructor(private router: Router,
private authService: AuthService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// send the newly created request //.timeout(10000)
return next.handle(authReq)
.pipe(
catchError(error => {
// dont navigate if 404. 404 could be a valid api response for some things like getting the user picture.
if (error.status && error.status === 404) {
return of(undefined);
}
else {
this.router.navigate(['/error']);
return throwError(error);
}
})
);
}
}
我们可以在这里看到,如果它是404,我们只是返回一个可观察到的undefined。
以下是一些发出http请求的代码:
forkJoin(
this.api.getSomeStuff(), // this returns data
this.api.GetUser(), // this returns data
this.api.GetPicture() // this could be 404 which is valid
)
.subscribe(res => {
console.log("sub")
},
() => console.log("err"),
() => console.log("com"));
输出:
// com
我不知道如何强制catchError替换流中的项目。 catchError可以采用2个参数,一个是错误,一个是捕获的可观察值。如果我改为返回捕获到的可观察对象,则似乎陷入了http调用的无限循环。
编辑:
将拦截器手柄管道更改为此:
return next.handle(authReq)
.pipe(
catchError((error, caught) => {
// dont navigate if 404. 404 could be a valid api response for some things like getting the user picture.
if (!error.status || error.status === 404) {
this.router.navigate(['/error']);
}
return throwError(error);
})
);
以及与此的forkjoin:
forkJoin(
this.api.GetBusinessTypes(),
this.api.GetUser(),
this.api.GetPicture().pipe(catchError(err => of(undefined)))
)
已经工作了,但是现在每当我进行forkjoin时,我都需要重复此管道。