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

如何在拦截器中取消当前请求-Angular 4,angular,angular-http-interceptors,Angular,Angular Http Interceptors,正如您所知,在Angular 4的新版本中可以使用拦截器 在我的例子中,我想在某些情况下取消拦截器中的请求。 那有可能吗?或者我应该问的是,我应该怎么做 也会好的!如果我找到一种方法来重写对请求的响应,而不是取消它。我认为要切断拦截器链,只需返回一个空的可观察的,如下所示: let sub = this.http.get(url, {headers: reqHeaders}) .subscribe( (res) => {

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

在我的例子中,我想在某些情况下取消拦截器中的请求。 那有可能吗?或者我应该问的是,我应该怎么做


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

我认为要切断拦截器链,只需返回一个空的
可观察的
,如下所示:

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

sub.unsubscribe();
import { EMPTY } from 'rxjs';

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

  return next.handle(request);
}
从'rxjs'导入{EMPTY};
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(停止此请求){
返回空;
}
下一步返回。处理(请求);
}

受@RVP answer的启发,我发现可以使用
Observable.throw()以同样简单的方式切断带有错误的链条。

/。。。
截取(req:HttpRequest,next:HttpHandler):可观察{
如果(停止此请求){
返回可观察的.throw('Error message');
}否则{
返回next.handle(req);
}
}

这避免了用未定义的值来实现响应承诺。

@RVP的代码可以工作,我们可以为同样的结果做更多的事情

仅添加
return
,它也可以工作

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

    }
intercept(req:HttpRequest,next:HttpHandler):可观察{
if(helper.isTokenExpired(tokenVal)){
返回;
}
.
. 
.
}

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

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);
    }
}
从'rxjs'导入{Observable};
从'rxjs/internal/Observer'导入{empty};
//...
截取(req:HttpRequest,next:HttpHandler):可观察{
如果(停止此请求){
返回可观察。创建(空);
}否则{
返回next.handle(req);
}
}

这只是答案的一个微小变化

从'rxjs'导入{NEVER};
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(停止此请求){
永不回头;
}
下一步返回。处理(请求);
}
我使用了
NEVER
而不是
EMPTY
,以避免处理订阅(或承诺)中未定义的值


使用
从不
如果您不想像上面建议的那样调用订阅回调

,则有更理想的方法通过自定义响应处理错误

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'导入{throwError,Observable};
从'@angular/common/http'导入{HttpEvent};
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(授权失败摘要(请求)){
return-throwerr(新错误(“授权错误:请求未通过”);
}
下一步返回。处理(请求);
}


你所说的“重写一些响应”是什么意思?在处理请求之前编辑请求很容易,如果这是您的意思的话。文档中有一个例子:我提到这一点是因为我在中看到了angularjs中的一些功能。@JBNizet我反复查看了文档!我想这一个是没有提到的文件或可能我看不到它!我想要的是取消一个请求,或者重写另一个响应,而不是从服务器得到的响应。为其提供服务,而不是将请求转发给下一个处理程序。因此,它会返回缓存响应,而不是将请求发送到服务器。谢谢您的回答,但这不是解决方案!这不能在拦截器中完成,因为你没有订阅,但是有HttpRequest。@maximeMorin,是的,你可以,如果你可以返回一个可观察的,你可以返回一个可观察的,告诉你的订阅者取消订阅。在一个场景中,假设我有两个rxJS请求同时执行到后端,我想阻止其中一个,我怎样才能用拦截器做到这一点@RXJS 6的RVP只需从“RXJS”导入{EMPTY}并返回EMPTY。仅供参考,rxjs中的EMPTY与EMPTY不同。如何在httpclient中拦截响应时取消响应,Observable.EMPTY()不适用working@Codehan25这种逻辑你必须自己想出来。您可以使用DI在拦截器中注入您想要的任何服务,并根据应用程序库中的可用状态来建立逻辑,这正是我所寻找的,对我帮助很大:)在一个场景中,假设我有两个rxJS请求同时执行到后端,我想停止其中一个,我怎样才能用拦截器做到这一点呢?这个答案(在RxJS的当前版本中使用throwError)是唯一对我有用的东西。正如其他人所说,EMPTY有一些令人讨厌的副作用,因为等待结果的代码从未运行过。
throwError(…)
now@Codehan25这只是我提出的一个变量,你需要根据需要自行设置条件。请详细说明什么是可观察的。创建(空);Empty是一个RxJs观察者,它取消请求,但仍然返回一个有效的观察者。您可以通过这个导入将他添加到您的项目中:从'rxjs/internal/Observer'导入{empty};这对我不起作用-出现错误“您提供了预期流的‘未定义’位置。您可以提供可观察、承诺、数组或可引用。”在angular universal中使用此选项,应用程序将卡住并继续等待请求解决。
import { NEVER } from 'rxjs';

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

  return next.handle(request);
}
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);
}