Бесконечный с угловыми сервисами и перехватчиком - PullRequest
0 голосов
/ 16 декабря 2018

Я работаю в электронной коммерции, используя 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));
  }
}
...