我找到了另一个方法,可以阻止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)
);