Обработка счетчика для нескольких вызовов REST

Контекст

В приложении Angular у меня есть три <select> ящики, которые загружаются из базы данных с относительно небольшим набором данных. Эти коробки являются частью фильтра Component который отображается рядом с таблицей данных на стороне сервера. Компонент выводит фильтр асинхронно родительскому компоненту, который затем направляет его в таблицу, вызывает сервер, отфильтровывает SQL и т. Д.

Ориентируясь на область видимости, когда элемент управления загружен, я хочу вызвать сервер с тремя GET призывы. Пока они не завершатся, я хочу отобразить счетчик.

Поскольку я использую библиотеку элементов управления, часть кода уже готова. Я хочу спросить здесь, занимаюсь ли я Observables правильно с угловой точки зрения

Код, который я написал до сих пор

Код работает

export class MyComponent implements OnInit, OnDestroy {

  public filterLoading$: BehaviorSubject<boolean>;
  public select1: Observable<string[]>;
  public select2: Observable<string[]>;
  public select3: Observable<string[]>;
  private filterLoadingSub$?: Subscription;

  constructor(private remoteService: RemoteService) {
    this.select1 = remoteService.getFirst();
    this.select2 = remoteService.getSecond();
    this.select3 = remoteService.getThird();
    this.filterLoading$ = new BehaviorSubject<boolean>(true);
  }


  ngOnInit(): void {
    this.filterLoadingSub$ = forkJoin([this.select1, this.select2, this.select3])
      .subscribe(() => this.filterLoading$.next(false))
    ;
  }


  ngOnDestroy(): void {
    if (!!this.filterLoadingSub$) {
      this.filterLoadingSub$.unsubscribe();
    }
  }

}

Объяснение:

  • selectX привязаны к переднему концу с <option *ngFor="let x of (selectX | async)" ...>
  • Предмет filterLoading$ используется для отображения счетчика. На самом деле мой аккордеон делает это за меня. <acme-filter-panel isLoaded="!(filterLoading$ | async)>
  • Затем я использовал forkJoin оператору дождаться завершения всех трех вызовов. Меня не волнует последнее возвращенное значение, а только то, что три завершены. Но это приводит к Subscription
  • Под философией выбрасывать собственный мусор, каждый раз, когда я ударяю Subscription Я всегда пишу код для отказа от подписки. Однако это просто HTTP-вызовы, которые при вызове возвращаются только один раз.

Я действительно понимаю, что не обрабатываю логику ошибок, но на самом деле это выходит за рамки вопроса

Вопросов

У меня вопрос о двух аспектах.

Помимо перемещения кода из конструктора в ngOnInitпо причинам симметрии я пишу слишком много кода или есть какое-то упрощение, которое я могу использовать, чтобы сказать Angular, чтобы разблокировать прядильщик, когда произошли все три вызова?

Всегда ли нужно отказываться от подписки? Или бывают случаи, когда болтающийся подписка никому не вредит? Я узнал, что подписки используют память, поэтому считаю необходимым по возможности очищать ресурсы, даже если на современных машинах есть гигабайты оперативной памяти.

В общем, можно ли написать эту статью более лаконично? Для трех наборов данных мне пришлось создать четвертый элемент, который на самом деле необходим для отслеживания счетчика, и пятый элемент, используемый только при уничтожении для очистки. Я часто работаю с Observables & co.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *