如何在拦截器中取消当前请求 - Angular 4

Beh*_*imi 24 angular-http-interceptors angular

如您所知,可以在新版本的Angular 4中使用Interceptor.

在我的,我想在某些条件下取消拦截器中的请求.那有可能吗?或者我应该问的是,我应该采取哪种方式?

它也会好的!如果我找到一种方法来重写对请求的一些响应而不是取消它.

RVP*_*RVP 32

我认为你需要做的就是切断拦截器链就是这样简单地返回一个空Observable:

import { EMPTY } from 'rxjs';

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  if (stopThisRequest) {
    return EMPTY;
  }

  return next.handle(request);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于RXJS 6,只需从'rxjs'导入{EMPTY}并返回EMPTY.仅供参考,在rxjs中,EMPTY不同于空. (2认同)

ver*_*tas 7

受@RVP答案的启发,我发现可以使用以下相同的简单方法以错误的方式切断链 Observable.throw()

//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (stopThisRequestWithError) {
        return Observable.throw('Error message');
    } else {
        return next.handle(req);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以避免使用未定义的值来实现响应承诺。

  • `throwError(...)` (2认同)

dev*_*per 5

这只是RVP答案的一个轻微变体

import { NEVER } from 'rxjs';

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  if (stopThisRequest) {
    return NEVER;
  }

  return next.handle(request);
}
Run Code Online (Sandbox Code Playgroud)

我使用NEVER而不是EMPTY避免在我的订阅(或承诺)中处理未定义的值。

使用NEVER,如果你不想被调用您的订阅回调