angular http拦截器 - 中止响应

问题描述 投票:1回答:2

有没有办法使用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

angular rxjs angular-http-interceptors angular-httpclient
2个回答
1
投票

您可以使用Observable.empty来完成流而不会发出任何数据。要将它与HttpInterceptor结合,将其链接到next.handle

return next.handle(req).switchMap(() => Observable.empty());

对不起,我不知道如何用Promise做到这一点。


0
投票

我找到了另一种方法来阻止调用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)
);
© www.soinside.com 2019 - 2024. All rights reserved.