2

我有一个搜索服务返回结果,如果用户提交两次,只有最后一次搜索应该返回结果。

我在服务中有以下代码,视图(在别处更新)具有请求所需的所有帖子正文信息。

使用 this.searchService.getResults() 从代码中的其他地方调用此方法

getResults() {
    const view: SearchView = this.getCurrentSearch();
    if (!view.query || view.query === '') {
      return;
    }

    this.checkPermissions(view).subscribe(searchView => {
     //do some stuff
     this.cacheService
       .cachedPost(this.url, searchView, () => {
        return this.http.post(this.url, searchView);
      })
      .switchMap(res => this.pageTransform(res))
      .subscribe(
        // results here
      );
   });
}

`

从运行测试中我可以看到,如果我快速连续触发 3 次搜索,它们都会解决,而我只想要最后一个。

4

1 回答 1

4

那是因为您getResults()多次调用该方法会创建多个 Rx 链,并且所有这些链都会被处理。如果你想switchMap正常工作,你需要只保留一个链的引用并将值推送到它:

private search$ = new Subject();

private searchSubscription = search$
  .switchMap(view => this.checkPermissions(view)
    .concatMap(searchView => this.cacheService.cachedPost(this.url, searchView, () => {
      return this.http.post(this.url, searchView);
    })
    .concatMap(res => this.pageTransform(res))
  )
  .subscribe(...);

getResults() {
  const view: SearchView = this.getCurrentSearch();

  ...

  this.search$.next(view);
}

出于明显的原因,我没有测试此代码,但我认为您会明白这一点。也不要忘记取消订阅ngOnDestroy()this.searchSubscription.unsubscribe()

于 2018-03-28T16:03:02.170 回答