angular http interceptor - abort response

时间:2018-02-14 22:36:16

标签: angular rxjs angular-http-interceptors angular-httpclient

有没有办法使用angular的http拦截器拦截响应,有点删除它/丢弃它,以便未来的下游回调不被执行?

我希望它的行为使得两个console.log都不会被执行。

this.http.get('/foo').subscribe(
    data => console.log("success", data),
    err => console.log("fail.", err)
);

我已经看过修改响应的示例,或用null或其他一些标记值替换响应,但我宁愿不这样做,因为我的所有成功/失败处理程序都必须寻找哨兵,这会减少使用拦截器处理某些响应的有用性。

我感觉这更像是一个rxjs问题而不是一个角度拦截器问题,但我对rx还不够熟悉,但还不确定。

如果重要,我正在使用角度5.1

2 个答案:

答案 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)
);