我正在使用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);
}