Javascript SwitchMap在Angular中未按预期工作

Javascript SwitchMap在Angular中未按预期工作,javascript,angular,typescript,rxjs,switchmap,Javascript,Angular,Typescript,Rxjs,Switchmap,我有一个搜索服务返回结果,如果用户提交两次,只有最后一次搜索应该返回结果 我在服务中有以下代码,视图(在别处更新)包含请求所需的所有帖子正文信息 使用This.searchService.getResults()从代码中的其他地方调用此方法 ` 从运行测试中,我可以看到,如果我连续快速启动3次搜索,它们都会得到解决,而我只希望最后一次得到解决。这是因为您多次调用方法getResults(),该方法会创建多个Rx链,并且会对它们进行处理。如果希望switchMap正常工作,则只需保留对一个链的引用

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

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

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

`


从运行测试中,我可以看到,如果我连续快速启动3次搜索,它们都会得到解决,而我只希望最后一次得到解决。

这是因为您多次调用方法
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);
}

我没有测试这段代码,原因很明显,但我想你会明白的。另外,不要忘记使用
this.searchSubscription.unsubscribe()
取消订阅
ngondstroy()

第二个concatMap似乎没有被调用,你知道为什么吗?你需要两个concatMap吗?它们可以合并成一个吗?我已经组合了,但是这个.pageTransform()得到了一个可观察的对象,当我尝试映射可观察对象并从pageTransform返回它时,什么都没有happens@BenTaliadoros是的,你必须同时使用这两种方法,因为你想按顺序运行这两个观测值。
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);
}