Angular 5拦截器忽略部分代码

Angular 5拦截器忽略部分代码,angular,angular5,angular-http,angular-http-interceptors,angular-httpclient,Angular,Angular5,Angular Http,Angular Http Interceptors,Angular Httpclient,我已经用这个新的HttpInterceptor模块开发了一个angular 5拦截器,它工作正常一半。更详细地说,我的服务器端API提供了令牌刷新服务,因此下面是所需的过程: 对于每个http请求,拦截器向请求中添加承载令牌。如果401状态失败,拦截器首先使用内部服务刷新承载令牌,然后使用新的访问令牌重新发送原始请求,只有当它失败时,我们才会重定向到登录页面 我已经为我的拦截器编写了以下代码,它工作得非常好:它将承载令牌添加到请求中,如果有401,它将使用内部服务刷新承载令牌。但由于某些原因,它

我已经用这个新的HttpInterceptor模块开发了一个angular 5拦截器,它工作正常一半。更详细地说,我的服务器端API提供了令牌刷新服务,因此下面是所需的过程: 对于每个http请求,拦截器向请求中添加承载令牌。如果401状态失败,拦截器首先使用内部服务刷新承载令牌,然后使用新的访问令牌重新发送原始请求,只有当它失败时,我们才会重定向到登录页面

我已经为我的拦截器编写了以下代码,它工作得非常好:它将承载令牌添加到请求中,如果有401,它将使用内部服务刷新承载令牌。但由于某些原因,它不会使用新刷新的令牌重新发送请求,基本上这段代码只是被“忽略”:

从'@angular/core'导入{Injectable};
进口{
HttpRequest,
HttpHandler,
HttpResponse,
HttpErrorResponse,
HttpEvent,
http拦截器
}来自“@angular/common/http”;
从“/auth.service”导入{AuthService};
从“rxjs/Observable”导入{Observable};
@可注射()
导出类TokenInterceptor实现HttpInterceptor{
构造函数(公共身份验证:身份验证服务){}
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
log(“拦截器启动:+this.auth.getAccessToken());
request=request.clone({
集合标题:{
授权:`Bearer${this.auth.getAccessToken()}`
}
});
返回next.handle(request).do((事件:HttpEvent)=>{
if(HttpResponse的事件实例){
console.log(“第一个:”,事件);
}
},(错误:任何)=>{
if(HttpErrorResponse的错误实例){
如果(err.status==401 | | err.status==500){
log(“正在尝试刷新”);
返回此.auth.refreshToken()
.订阅(
d=>
{
console.log(“刷新成功”);
request=request.clone({
集合标题:{
授权:`Bearer${this.auth.getAccessToken()}`
}
});
返回next.handle(request).do((event2:HttpEvent)=>{
console.log(“***”);
if(HttpResponse的事件2实例){
日志(“第二个:”,事件2)
}
},(err2:any)=>{
console.log(“####”);
if(HttpErrorResponse的err2实例){
log(“也是重定向到登录的地方…”);
}
});
},
d=>
{
log(“这里是重定向的时候…”);
返回可观察。抛出(错误);
}
)
}
}
});
}
}
我真的需要一些帮助来解释为什么第二个
返回next.handle(request.do…
会被完全忽略。谢谢

不要使用subscribe(如果您使用subscribe,那么您正在破坏可观察状态)如果您想进行两次调用,第二次调用取决于第一次调用,或者我们需要等待响应,请使用switchMap
import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpResponse,
  HttpErrorResponse,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import { AuthService } from './auth.service';
import { Observable } from 'rxjs/Observable';


@Injectable()
export class TokenInterceptor implements HttpInterceptor {

  constructor(public auth: AuthService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log("Interceptor engaged: " + this.auth.getAccessToken());

    request = request.clone({
      setHeaders: {
        Authorization: `Bearer ${this.auth.getAccessToken()}`
      }
    });

    return next.handle(request).do((event: HttpEvent<any>) => {
      if (event instanceof HttpResponse) {
        console.log("first: ", event);
      }
    }, (err: any) => {
      if (err instanceof HttpErrorResponse) {
        if (err.status === 401 || err.status === 500) {
            console.log("attempting refresh.");
            return this.auth.refreshToken()
            .subscribe(
                d => 
                {
                    console.log("refresh success");
                    request = request.clone({
                        setHeaders: {
                            Authorization: `Bearer ${this.auth.getAccessToken()}`
                        }
                    });
                    return next.handle(request).do((event2: HttpEvent<any>) => {
                        console.log("***");
                        if (event2 instanceof HttpResponse){
                            console.log("second: ", event2)
                        }
                    }, (err2: any) => {
                        console.log("###");
                        if (err2 instanceof HttpErrorResponse){
                            console.log("Also where you redirect to login...");
                        }
                    });
                },
                d =>
                {
                    console.log("here is when you redirect...");
                    return Observable.throw(err);

                }
            )
        }
      }
    });
  }
}