Angular拦截器中不匹配过滤条件的响应会被滞留吗?需调用next.handle吗?
问题
经过该拦截器的响应如果不匹配过滤条件,是否会被滞留此处?它会被向前传递吗?还是我需要通过调用next.handle来处理其他情况?
intercept(httpRequest: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(httpRequest).pipe( filter((event) => event instanceof HttpResponse && event.body && event.body.response), map((event: any) => event.clone({ body: event.body.response })) ); }
回答
当前代码的行为
你现在的代码里,filter操作符会直接丢弃所有不符合条件的事件,不会让它们继续向下传递到后续的订阅者(比如组件或服务)。具体来说:
- 只有同时满足「是
HttpResponse实例」「存在响应体」「响应体包含response字段」的事件,才会通过filter进入map做转换,最终传递出去。 - 其他所有事件(比如请求进度事件
HttpProgressEvent、错误响应HttpErrorResponse,或者不包含response字段的HttpResponse)都会被拦截器过滤掉,无法到达订阅者。
如何让所有事件正常传递
如果你希望不符合过滤条件的事件也能正常向前传递,不能只依赖filter,需要改用支持分支逻辑的操作符(比如mergeMap),对符合条件的事件做转换,不符合的直接放行:
import { of } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; intercept(httpRequest: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(httpRequest).pipe( mergeMap((event) => { // 仅对符合条件的HttpResponse做转换 if (event instanceof HttpResponse && event.body && event.body.response) { return of(event.clone({ body: event.body.response })); } // 其他事件直接原样传递 return of(event); }) ); }
不需要额外调用next.handle,因为你已经在next.handle(httpRequest)返回的原始事件流上做处理了,只需在分支里把不符合条件的事件直接返回即可。
内容的提问来源于stack exchange,提问作者blueorange
相关产品推荐
相关产品推荐

