有没有办法使用angular的http拦截器拦截响应,有点删除它/丢弃它,以便未来的下游回调不被执行?
我希望它的行为使得两个console.log都不会被执行。
this.http.get('/foo').subscribe(
data => console.log("success", data),
err => console.log("fail.", err)
);
我已经看过修改响应的示例,或用null或其他一些标记值替换响应,但我宁愿不这样做,因为我的所有成功/失败处理程序都必须寻找哨兵,这会减少使用拦截器处理某些响应的有用性。
我感觉这更像是一个rxjs问题而不是一个角度拦截器问题,但我对rx还不够熟悉,但还不确定。
如果重要,我正在使用角度5.1
答案 0 :(得分:1)
您可以使用Observable.empty
完成流而不会发出任何数据。要将其与HttpInterceptor
合并,请将其链接到next.handle
:
return next.handle(req).switchMap(() => Observable.empty());
我不知道如何使用Promise
做到这一点,对不起。
答案 1 :(得分:0)
我发现了另一个方法,该方法将防止调用subscribe()回调。这是一个示例拦截器,如果HttpResponse中存在某个http标头,它将避免调用下游订户。
但是请注意,这种方法并没有真正“扔掉响应”。而是无限期地延迟响应。如果您有使用计时器的代码(例如,某些代码在60秒内未收到成功或错误响应都将出错的代码),则可能是一个问题,因为这正是该方法的工作方式-它永远不会响应。 / p>
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(
switchMap((event: HttpEvent<any>) => {
// In this example, I only care about checking valid http responses.
// But, if you also want to inspect errors, you might consider checking for HttpResponseBase or HttpErrorResponse
if (event instanceof HttpResponse) {
// Check if this response has a certain http response header set.
// If so, we throw the response away.
if (event.headers.has('my-custom-header')) {
// We intentionally return an Observable that will never complete. This way,
// downstream subscribers will never receive anything, and any .toPromise()
// conversions that may be present will also never be invoked because toPromise() only
// gets invoked when the Observable completes.
// It doesn't actually throw the response away, but rather, it makes the subscribers wait forever, so they will never get a response.
// Be careful if you use timeouts.
return new Subject<HttpEvent<any>>();
}
}
// The default case - we pass the response back through unmodified.
return Observable.of(event);
})
);
}
// These console.logs will not be called
this.http.get('/foo').subscribe(
data => console.log("success", data),
err => console.log("fail.", err)
);
// Neither will these
this.http.get('/foo').toPromise(
data => console.log("success", data),
err => console.log("fail.", err)
);