RxJS 6-Angular 7-正确取消主题的当前http请求

时间:2019-03-26 16:34:34

标签: angular rxjs switchmap

嗨,我的主题订阅和搜索电话出现问题。我想取消上一个通话,转而使用当前通话。我已经搜索了以前的主题,但是没有找到答案。

我知道我应该使用switchMap(),但是我没有成功。无论状态如何,它都会继续所有呼叫。我认为这与我设置的方式有关,因为我没有返回我正在设置的响应。因此,没有可观察的参考。

感谢所有帮助!

请参见下面的代码:

ngOnInit() {
// I subscribe to the Subject Observable here
this._searchService.quickSearch$
  .pipe(
    debounceTime(1000),
    distinctUntilChanged()
  )
  .subscribe(
    // when value has changed I call runSearch
    (queryString) => {this.runSearch(queryString);
  }
  );
}

runSearch:

runSearch(searchString: any) {
this.quickSearch.runSearch(searchString).pipe(
   //Not working as expected
    switchMap(() => {
      console.log('switchMap has bee fired');
      return this.quickSearch.runSearch(searchString);
    })
).subscribe(
    (response) => {
    //  set the two way bind here
    this.apiResponse = response;
  },
  (error) => {
    console.log('ERROR!!!');
  },
  () => {
    // this is fired when the observable is closed
    console.log('I have been unsubscribed');
  }
  );
 }

快速搜索服务:

  runSearch(search: string): Observable<QuickSearch[]> {

   ...

    return this.http.get<QuickSearch[]>(this.api.url, { params: param, headers: header })
      .pipe(
        map((data: any) => {
             return data.map((item: any[]) => this.adapter.adapt(item));
        }
        ),
        catchError(error => error)
      );

  }

谢谢

更新

我仍然没有找到这个问题的答案。因此,我将尝试重新措辞。

我有5个部分:

    Input box ([])-> 
    rxjs-Subject (input-text)-> 
    runSearch(input-text) -> [ handles response ] 
    _service.runSearch(input-text) ->
    http().get(input-text) => response

更改输入框后,将调用运行搜索,在运行搜索中也订阅了搜索服务,这不会返回

1 个答案:

答案 0 :(得分:2)

问题在于,每次this._searchService.quickSearch$发出信号时,您都在调用runSearch方法,该方法每次都会创建一个新链,因此即使您拥有switchMap也没有什么区别。

相反,您应该将switchMap放在第一条链上:

this._searchService.quickSearch$
  .pipe(
    debounceTime(1000),
    distinctUntilChanged(),
    switchMap((searchString) => this.quickSearch.runSearch(searchString)),
  ).subscribe(
    (response) => {
      this.apiResponse = response;
    },
    ...
  );