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

How to cancel current request in interceptor - Angular 4

如您所知,可以在 Angular 4.

的新版本中使用 拦截器

在我的情况下,我想在某些情况下取消拦截器中的请求。 那有可能吗?也许我应该问的是:我应该用什么方式来做?

如果我找到一种方法来重写对请求的某些响应而不是取消它,那也可以。

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

sub.unsubscribe();

我认为要切断拦截器链,您只需 return 一个空的 Observable 就像这样:

import { EMPTY } from 'rxjs';

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

  return next.handle(request);
}

受@RVP 回答的启发,我发现可以使用 Observable.throw()

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

这避免了用未定义的值履行响应承诺。

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

仅添加return,它也有效

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

    }

到Angular 6、你需要可以使用下面的结构来return一个空的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);
    }
}

这只是 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

如上所述,有更优化的方法来处理自定义响应的错误

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);
}

嘿,我想我来晚了,但想分享一些额外的知识

如果你想在某个超时后取消请求,你可以在拦截器中使用 rxjs 超时运算符,它对每个请求都有效。

  intercept(req: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<unknown>> 
    {
    return next.handle(req).pipe(timeout(30000), 
    catchError((error: HttpErrorResponse) => {
      return throwError({ error: error.name, message: error.message});
    })) as Observable<HttpEvent<unknown>>
    }