繁体   English   中英

Angular 8 在拦截器中订阅一个 observable

[英]Angular 8 subscribe to an observable in an interceptor

我正在尝试编写一个 HTTP 拦截器来向请求添加一个“访问级别”参数。 我试图从可观察的 currentAccessLevel$ 中获取值。 但是,observable 没有正确返回,拦截器打断了整个请求周期。

这个问题已经在这里这里有了答案,但是,接受的答案似乎在 Angular 8 中不起作用。我不确定我是否做错了什么,或者是否对 Angular 8 中的拦截器进行了某种更改.

我也尝试过使用 switchMap、flatMap 和 mergeMap。

import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { AuthService } from 'src/app/services/auth/auth.service';

@Injectable()
export class AccessLevelInterceptor implements HttpInterceptor {
  private accessLevel: string;

  constructor(private authService: AuthService) { }

  // Intercept HTTP Requests
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    // Get current value of access level observable from authentication service
    return this.authService.currentAccessLevel$
      .mergeMap(res => next.handle(request));

  }

}

currentAccessLevel$ 是在服务中作为 BehaviorSubject 创建的字符串值,然后转换为 Observable。 这样,字符串的当前值可以在多个组件之间共享。

// Create a BehaviorSubject to track and share updates to currentAccessLevel value
  private currentAccessLevel: string;
  currentAccessLevelSubject: BehaviorSubject<string> = new BehaviorSubject(this.currentAccessLevel);
  currentAccessLevel$ = this.currentAccessLevelSubject.asObservable();

是的,从 Rxjs 5.5 开始,这不再起作用了。 您需要使用管道方法来连接运算符:

return this.authService.currentAccessLevel$
      .pipe(mergeMap(res => next.handle(request)));

查看此处以了解有关管道的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM