Anguar RxJS:Hot Observable变为Cold

时间:2019-05-28 13:10:14

标签: angular typescript rxjs

这是我的相关代码:

private searchClickSubject:Subject<void>;  // Submit form
private searchClick$:Observable<any>;
private metrics$:Observable<MetricGroup>;

constructor() {
    // Prepare observers
    this.searchClickSubject = new Subject<void>();
    this.searchClick$ = this.searchClickSubject.asObservable();
}

public ngOnInit() {
    // Grab search button click event
    this.searchQuery$ = this.searchClick$.pipe(
        map(() => <Query>{
            offset: 0,
            limit: AmetriquesComponent.DEFAULT_PAGE_SIZE
        })
    );

    const loading = () => tap(() => this.loadingPage());
    const getAggregatedMetrics = () => switchMap((query: Query) => this.service.getAggregatedMetrics(query));
    const loaded = () => tap((aggregatedMetrics: MetricGroup) => this.loadedMetric(aggregatedMetrics));

    this.metrics$ = this.searchQuery$
        .pipe(
            loading(),
            getAggregatedMetrics(),
            loaded(),
            share()
        );
}

首先,我认为searchClick$很热门,因为无论附加了什么订阅,表单都会在提交事件中生成。

如您所见,发出“提交”事件后,我发出了一个http请求。因此,对于发出的每个“提交表单”,都会发出一个新的http请求。

当我在最后一个Observable上附加订阅时,会发出一个单独的http请求,因此听起来第一个Observable打开了一个冷的Observable。

您如何看待我的精打细算?

1 个答案:

答案 0 :(得分:0)

我仍然认为这是一个热门观察,因为它永远不会发出完整的通知。 getAggregatedMetrics的内部订阅将发出一个订阅,而不发出外部订阅。 share()还会根据this article将冷的可观察物变热。除非我不明白这个问题?