Angular / Rx Js - Отказаться от подписки зависимых служб http с помощью take (1)? - PullRequest
2 голосов
/ 12 марта 2020

--Component.ts--

 getGenCoreLabs() {
    this.checkinService
      .getLaboratories()
      .pipe(
        switchMap(outerResp => {
          const total = outerResp.headers.get(outerResp.headers.get('total'));
          return this.checkinService.getGenCoreLabs(total);
        }),
        take(1)
      )
      .subscribe(resp => {
        this.apiResponse = resp;
        this.areaList = this.apiResponse.map(labName => {
          return labName.Name;
        });
        this.areaListIds = this.apiResponse.map(labGuid => {
          return labGuid.Guid;
        });
      });
  }

В приведенном выше коде в моем файле component.ts достаточно ли одного дубля (1), чтобы отписаться от зависимых служб http? Или мне нужно вызвать take (1) внутри второго сервиса (getGenCoreLabs) в файле service.ts? (см. код ниже для справки)

- Service.ts -

public getGenCoreLabs(total: number): Observable<CoreLaboratoryData> {
    const url = `/core/laboratories?per-page=${total}`;
    return this.httpService.get(url).pipe(take(1));
  }

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Вам не нужно отписываться, когда наблюдаемое является конечной последовательностью. Это относится к HTTP-запросу, который выдаст только одно значение.

Тот же случай, например, с timer(1000), который выдает одно значение только через 1000 мс.

Для получения дополнительной информации о различных ситуациях когда вам нужно отписаться или вам не нужно отписываться, отметьте Когда отписаться в Angular от Netanel Basal.

Таким образом, ваш код может быть:

getGenCoreLabs() {
  this.checkinService.getLaboratories().pipe(
    switchMap(outerResp => {
      const total = outerResp.headers.get(outerResp.headers.get('total'));
      return this.checkinService.getGenCoreLabs(total);
    }),
  ).subscribe(resp => {
    ...
  })
}
2 голосов
/ 12 марта 2020

Наблюдаемый может делать 3 вещи: уведомлять, сообщать об ошибке и завершать.

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

Если вы моделируете запрос http как Наблюдаемый, как в Angular, то, что вы have - это Observable, которое может выполнять только одну из следующих двух вещей:

  1. Уведомляет ответ, когда он приходит, и затем завершает
  2. Ошибки, если что-то идет не так

В обоих случаях Observable больше не будет уведомлять, так что вам не нужно отписываться.

Вы можете посмотреть этот ответ для получения более подробной информации.

...