使用switchMap取消订阅先前的HTTP请求,仅接收最新的一个

我目前面临的一个问题是,第一次搜索可能需要5秒钟,而第二个搜索则需要2秒钟,问题是,第一次搜索需要更长的时间,将“擦除”此后执行的请求的结果,因为通话结束。


我试图阅读有关


switchMap


在rxJs中并尝试使用它,但是从我的尝试来看,它不会取消订阅先前的请求并清除了结果。


我可能在这里做错了什么,但我无法确切指出问题所在。


合并在结果中有3个更改源(分页,排序或新的搜索条件),对sendSearchCriteria的调用返回使用的数据。


sendSearchCriteria返回一个 Observable


有什么想对您的,我做错了吗?


感谢您的帮助,


private loadDogsResults = (filtersInformation: FilterSearchCriteria) => {

    merge(this.sort.sortChange, this.paginator.page, of(filtersInformation))

      .pipe(

        distinctUntilChanged(),

        tap(() => (this.isLoading = true)),

        switchMap(() => this.sendSearchCriteria(filtersInformation)),

        //mergeMap(() => this.sendSearchCriteria(filtersInformation)),

        map(data => this.formatResults(data)),

        finalize(() => (this.isLoading = false)),

        catchError(error => this.handleError(error)),

        takeUntil(this._onDestroy$)

      )

      .subscribe((result: any[]) => {

        if (result.length > 0) {

          this.setDisplayedColumns(result[0]);

        }

        this.isLoading = false;

      });

  }


翻翻过去那场雪
浏览 298回答 3
3回答

慕盖茨4494581

哪个事件触发search?此事件应该是您的的来源Observable,它将与switchMap运算符“ piped” 。正如我在这里看到的那样,如果您要求loadDogsResults()每个事件,那么Observable每次创建一个新事件都将无效。of(filtersInformation)是一个Observable,它在filtersInformation订阅了observable时发出值ONCE,我认为这不是预期的行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript