无限的角度服务和拦截器

时间:2018-12-16 14:18:07

标签: angular angular6 angular-http angular7 angular-http-interceptors

我正在使用6号角在电子商务中工作,遇到以下问题。

我正在使用拦截器为请求设置自定义标头。此自定义标头是存储在LocalStorage中的哈希,由CartService提供。

我还有一个带有可观察性的AuthService,它会发出是否登录用户的信息。

在CartService中,它使用依赖项注入接收AuthService,并订阅该可观察项以查看用户是否登录,并在用户登录或注销时从后端重新加载购物车。

问题是:当我在拦截器中注入CartService时,会发生无限循环,因为CartService的构造函数再次运行,因此重新加载了购物车,并且发出了请求,因此拦截器再次运行。但是,CartService不应该是一个单例,它的构造函数应该只运行一次吗?

注意:CartService和CartHttpService都带有@Injectable({providedIn:'root'})批注

代码:

CartService:

let options= { series: [{ 
    name: "Temperature",
    data: d.map( (item,key) => key)
        .filter( key => key%3==0)
        .map(key=> [d[key],d[key+1]])
}]}

CartHashInterceptor:

export class CartService {


  private http: CartServiceHttp;

  constructor(http: CartServiceHttp,
              auth_service: AuthService) {
      auth_service.isLogged().subscribe( (is_logged: boolean) => this.loadCart());
  }

  loadCart() {

    this.http.getCart().pipe(

      tap( (resp) => {
        if (resp.hash) {
          localStorage.setItem('CH', resp.hash);
        }

        this.loaded_cart = true;
      }))

    .subscribe( (resp) => {
      this.cart_subject.next(new Cart(resp));
    });
  }
}

CartServiceHttp

@Injectable()
export class CartHashInterceptor implements HttpInterceptor {

  constructor(private cart_service: CartService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

   const hash = this.cart_service.getCartHash();

   request = request.clone({
        headers: request.headers.set('Cart-Hash', hash)
      });

   return next.handle(request);
}

0 个答案:

没有答案