首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular HTTP Interceptor不执行Observable

Angular HTTP Interceptor不执行Observable
EN

Stack Overflow用户
提问于 2021-06-27 17:50:10
回答 1查看 145关注 0票数 0

我正在尝试在Angular中实现一个滑动过期会话,在这个会话中,每次与API交互时都应该扩展会话。

HTTP拦截器负责在每次响应后更新令牌。这里的问题是,authService.renewToken()调用从未真正执行对该应用程序接口的请求。我确实在控制台中看到了begin renew tokenrenewToken日志消息,但是对API的令牌请求从不触发。

你知道问题出在哪里吗?

代码语言:javascript
复制
AuthenticationService


  public renewToken(token: string): Observable<Token> {

    console.log('renewToken');
    
    return this.api
      .createSession(token)
      .pipe(tap((newToken) => {
          console.log(token === newToken.token);

          this.saveToken(newToken);
        }));
  }
代码语言:javascript
复制
@Injectable()
export class ResponseInterceptor implements HttpInterceptor {
  private refreshingToken = false;
  private tokenSubject = new Subject<any>();

  constructor(private injector: Injector) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).pipe(tap(event => {

      if (this.shouldIntercept(event)) {
        this.tokenSubject.next(null);
        this.refreshingToken = true;

        const authService = this.injector.get(AuthenticationService);

        const currentToken = authService.getToken();

        console.log('begin renew token');
        
        return authService.renewToken(currentToken).pipe(
          switchMap((newToken: Token) => {
            console.log("newToken Recieved:", newToken.token);
            this.tokenSubject.next(newToken);
            return next.handle(req);
          }),
          finalize(() => { this.refreshingToken = false; })
        )
      }

      return next.handle(req);
    }), catchError(errorResponse => {
      this.refreshingToken = false;

      if (errorResponse.status === 401) {
        console.log('Unauthorised response received.');
        this.injector.get(Router).navigate(['error']);
      }
      return throwError(errorResponse);
    }));
  }
EN

回答 1

Stack Overflow用户

发布于 2021-06-28 22:45:44

假设您的saveToken函数返回一个observable,那么您可能看不到任何API响应的原因是tap不订阅this.saveToken。尝试使用switchMap/exhaustMap/concatMap (IMO switchMap最有意义,因为如果有新的请求到达,它将取消正在进行的请求)。这些运算符将自动订阅内部可观测数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68149896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档