angular - 如何完成 rxjs switchmap observable?

标签 angular rxjs angular8 rxjs-observables switchmap

我在我的 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 方法不会触发订阅。

我正在订阅类型为 BehaviourSubjectchartData。所以我不订阅 urlSubject。因为 url 可能会随时更改搜索或过滤器参数。

我正在使用 finilize,但它不起作用。我认为这个问题是关于 switchmap 内部孔隙的。如何完成并将加载设置为 false?

最佳答案

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

关于angular - 如何完成 rxjs switchmap observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61202642/

相关文章:

没有路由器或导入或 loadChildren 的组件 Angular 延迟加载

angular - 我可以在 Angular 7 中向 'window' 对象添加属性吗?

javascript - 如何阻止构造函数中的订阅调用直到完成?

Angular 8 应用程序编译显示 : "error TS1005: ' :' expected "

angular8 - 如何修复 "Error: Could not find the implementation for builder @angular-devkit/build-angular:dev-server"

Angular 7 - [ngModel] 不适用于 mat-select

javascript - 如何将日期选择器中的值绑定(bind)到 angular2 模型?

functional-programming - RxJs 运算符 groupBy 会泄漏内存吗?

javascript - 使用没有前缀延迟的sampleTime 运算符?

javascript - 如何从另一个可重用组件和容器组件访问可重用组件