有没有办法使用angular的http拦截器拦截响应,有点删除它/丢弃它,以便将来的下游回调不被执行?
我希望它表现得没有console.log的执行。
this.http.get('/foo').subscribe(
data => console.log("success", data),
err => console.log("fail.", err)
);
我已经看过修改响应的示例,或用null或其他一些sentinel值替换响应,但我宁愿不这样做,因为那时我的所有成功/失败处理程序都必须查找sentinel,这会降低使用拦截器处理某些响应。
我有一种感觉,这更像是一个rxjs问题而不是一个角度拦截器问题,但我对rx还不够熟悉,但还不确定。
如果重要,我使用角度5.1
您可以使用Observable.empty
来完成流而不会发出任何数据。要将它与HttpInterceptor
结合,将其链接到next.handle
:
return next.handle(req).switchMap(() => Observable.empty());
对不起,我不知道如何用Promise
做到这一点。
我找到了另一种方法来阻止调用subscribe()回调。这是一个示例拦截器,如果HttpResponse中存在某个http头,它将避免调用下游订阅者。
但要注意,这种方法并没有真正“抛弃响应”。相反,它无限期地延迟了响应。如果您有使用计时器的代码(例如,如果在60秒内未收到成功或错误响应,则会出错),这可能是一个问题,因为这正是该方法的工作方式 - 它只是从不响应。
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)
);