两次调用switchMap函数

时间:2019-04-13 08:47:54

标签: angular typescript

switchMap中的函数被调用两次。我不明白为什么,但是它正在发生。您能帮我解决这个问题吗?我需要调用一次此函数。

search(status = 0, groupId = 0, purchaseId = 0, pagedSearchQueries: Observable<PagedSearchQuery>): Observable<PurchaseItemListResult> {
    return pagedSearchQueries.pipe(
      debounce(val => val.isAutoLoad ? timer(1) : timer(400)),
      distinctUntilChanged(),
      switchMap(pagedSearchQuery => this.searchItems(status, groupId, purchaseId, pagedSearchQuery))
    );
  }

  private searchItems(status = 0, groupId = 0, purchaseId = 0, pagedSearchQuery: PagedSearchQuery): Observable<PurchaseItemListResult> {
    const params = new HttpParams()
      .set('status', status.toString())
      .set('groupId', groupId.toString())
      .set('purchaseId', purchaseId.toString())
      .set('offset', pagedSearchQuery.offset.toString())
      .set('limit', pagedSearchQuery.limit.toString());

    return this.http
      .get<PurchaseItemListItem[]>(`${this.endpoint}?search=${pagedSearchQuery.query}`, {
        observe: 'response',
        params
      }).pipe(
        map(res => {
          return new PurchaseItemListResult(parseInt(res.headers.get('X-Total-Count'), 10),
          pagedSearchQuery.offset,
          pagedSearchQuery.limit,
          pagedSearchQuery.query,
          res.body);
        }),
        catchError(this.handleError)
      );
  }

1 个答案:

答案 0 :(得分:0)

这可能是由于多个订阅,例如@mbojko所说。您可以发布“具有订阅者的功能”吗?

尝试在share之后添加switchMap运算符。这会将当前可观察的多播组播到多个订阅,并且如果存在至少一个订阅,则它将处于活动状态。 share之前的所有内容将只执行一次。

search(status = 0, groupId = 0, purchaseId = 0, pagedSearchQueries: Observable<PagedSearchQuery>): Observable<PurchaseItemListResult> {
  return pagedSearchQueries.pipe(
    debounce(val => val.isAutoLoad ? timer(1) : timer(400)),
    distinctUntilChanged(),
    switchMap(pagedSearchQuery => this.searchItems(status, groupId, purchaseId, pagedSearchQuery)),
    share()
  );
}

如果使用可观察对象.subscribe()或在模板中使用async管道,则可以进行Angular订阅。他们每个人都会产生一个新的订阅。