Как завершить rx js switchmap наблюдаемой? - PullRequest
1 голос
/ 14 апреля 2020

У меня есть наблюдаемое в моем angular 8 проекте, и я подписываюсь в ngOnInit ().

     export class ChartComponent implements OnInit {
       urlSubject: Subject<string> = new Subject();
       isLoading: BehaviorSubject<boolean> = new BehaviorSubject(false);
       chartData: BehaviorSubject<any[]> = new BehaviorSubject<any[]>([]);
       dataSubscription: Subscription;

       dataObservable: Observable<any> = this.urlSubject.pipe(
         switchMap((url: any) => this.httpClient.get<any[]>(url))
       )

       ngOnInit() {
         this.dataSubscription = this.dataObservable
          .pipe(tap(() => this.isLoading.next(true)))          
          .pipe(map((response: any) => response.result))      
          .subscribe((response: any) => this.chartData.next(response),
            () => this.isLoading.next(false),
            () => this.isLoading.next(false));

         this.urlSubject.next(this.data.settings.dataEndpoint)
      }
}

Но метод complate не запускает подписку.

Я подписываюсь на chartData этот тип BehaviourSubject. Поэтому я не подписываюсь на urlSubject. Потому что URL может измениться в любое время для параметров поиска или фильтра.

Я использую finilize, но он не работает. Я думаю, что эта проблема связана с внутренними процессами switchmap. Как я могу завершить и установить загрузку в ложь?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Вам необходимо использовать finalize на httpClient.get. Subject и BehaviorSubject не завершаются, пока вы не сделаете это вручную, вызвав subject.complete(). Однако Observable, созданный httpClient, завершает работу после выдачи ответа API, и вам нужно его использовать.

Для вашего примера:

dataObservable: Observable<any> = this.urlSubject.pipe(
  tap(() => this.isLoading.next(true)),
  switchMap((url: any) =>
    this.httpClient.get<any[]>(url).pipe(
      finalize(() => this.isLoading.next(false))
    )
  )
)
0 голосов
/ 14 апреля 2020

Как уже упоминалось выше, субъекты не завершаются, если только вы не вызываете subject.complete ();

При этом субъекты являются наблюдаемыми, вы всегда можете отказаться от них, используя операторы take(COUNT) или takeUntil и т. Д. c ....

...