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

时间:2017-09-26 19:01:06

标签: angular angular-http-interceptors

如您所知,在Angular 4的新版本中可以使用拦截器

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

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

7 个答案:

答案 0 :(得分:20)

我认为你需要做的就是切断拦截器链就是简单地返回一个空的Observable,如下所示:

import { EMPTY } from 'rxjs';

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

  return next.handle(request);
}

答案 1 :(得分:5)

受到@RVP答案的启发我发现使用Observable.throw()

可以用同样简单的方法剪切带有错误的链
//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (stopThisRequestWithError) {
        return Observable.throw('Error message');
    } else {
        return next.handle(req);
    }
}

这可以避免使用未定义的值来完成响应承诺。

答案 2 :(得分:0)

@ RVP的代码将起作用,我们可以再做一件事。

仅添加return,它也可以使用

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
          if(helper.isTokenExpired(tokenVal)){
              return;
          }
        .
        . <{code}>
        .

    }

答案 3 :(得分:0)

对于Angular 6,您需要使用以下结构来返回空的Observable:

import {Observable} from 'rxjs';
import {empty} from 'rxjs/internal/Observer';

//...

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (stopThisRequest) {
        return Observable.create(empty);
    } else {
        return next.handle(req);
    }
}

答案 4 :(得分:0)

这只是RVP's答案的细微变化

import { NEVER } from 'rxjs';

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

  return next.handle(request);
}

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

如果您不希望调用您的订阅回调,请使用NEVER

答案 5 :(得分:0)

如上所建议,通过自定义响应,有更多的最佳方式来处理错误

import { throwError, Observable } from 'rxjs';
import { HttpEvent } from '@angular/common/http';

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  if (authFailedDummy(request)) {
    return throwError(new Error('Authorization error: The request did not go through'));
  }
  return next.handle(request);
}

答案 6 :(得分:-5)

let sub = this.http.get(url, {headers: reqHeaders})
            .subscribe(
                (res) => {
                    res = res.json();
                }
            );

sub.unsubscribe();