Я работаю в электронной коммерции, используя angular 6, и у меня возникает следующая проблема.
Я использую перехватчик, чтобы установить пользовательский заголовок для запросов.Этот пользовательский заголовок является хешем, хранящимся в LocalStorage и предоставляемым CartService.
У меня также есть AuthService с наблюдаемым, который выдает, зарегистрирован пользователь или нет.
В CartService,он получает AuthService, используя внедрение зависимостей, и подписывается на эту наблюдаемую страницу, чтобы увидеть, вошел ли пользователь в систему или нет, и перезагружает корзину с сервера, когда пользователь входит в систему или выходит из нее.
Проблема заключается в следующем: когда яВнедрите CartService в перехватчик, возникает бесконечный цикл, потому что конструктор CartService запускается снова, и, следовательно, корзина перезагружается, и делается запрос, поэтому перехватчик запускается снова.Но не должен ли CartService быть единичным, и его конструктор должен запускаться только один раз?
Примечание: и CartService, и CartHttpService имеют аннотацию @Injectable ({обеспеченный в: «корень»})
Код:
Сервис корзины:
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));
});
}
}
Интерфейс CartHashInterceptor:
@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);
}
CartServiceHttp
Injectable({
providedIn: 'root'
})
export class CartServiceHttp {
private http: HttpClient;
constructor(http: HttpClient) {
this.http = http;
}
getCart(): Observable<Cart> {
const url = environment.cart_url + '/cart';
return this.http.get<Cart>(url)
.pipe(take(1));
}
}