如何完成 rxjs switchmap observable?

How to finilize rxjs switchmap observable?

我的 angular 8 项目中有一个 observable,并在 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 内部孔隙的。如何完成并将加载设置为 false?

如上所述,主题永远不会完成,除非您调用 subject.complete();

话虽如此,主题是可观察的,您可以随时使用 take(COUNT)takeUntil 运算符等取消订阅它们....

您需要在 httpClient.get 上使用 finalize。 Subject 和 BehaviorSubject 在您通过调用 subject.complete() 手动完成之前不会完成。然而,由 httpClient 创建的 Observable 在发出 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))
    )
  )
)