首页 > 解决方案 > RxJS 6 - 取消/结束管道

问题描述

尤其是使用新版本的 RxJS 6 和管道运算符。当前使用管道获取 API 调用的结果并将它们传递给一系列附加任务。

一切都很好,但如果我遇到问题,似乎无法找到取消或结束管道的方法。例如,我正在使用点击运算符来检查值是否为空。然后我抛出一个错误,但管道似乎仍然移动到下一个任务,在这种情况下是 concatmap。

因此,如何提前结束或取消管道?提前致谢。

getData(id: String): Observable<any[]> {
return this.http.get<any>(`${this.baseUrl}/path/${id}`).pipe(
   tap(evt => {
    if (evt == null) {
      return throwError(new Error("No data found..."));
    }
  }),
concatMap(
  evt =>
     <Observable<any[]>>(
        this.http.get<any[]>(
    `${this.baseUrl}/path/relatedby/${evt.child_id}`
      ).map(res =>( {"response1":evt, "response2":res}) )
 )
),
retry(3),
catchError(this.handleError("getData", []))
);}

标签: angularrxjspipetap

解决方案


您还可以使用信号Subject和 rxjs 运算符取消/结束管道:takeUntil

例子

httpGetSafe(path: string): Observable<Data> {
  const stopSignal$ = new Subject();

  return this.http.get<Data>(path).pipe(
    map(data => {
      const isBad = data === null;
      if (isBad) {
        stopSignal$.next();
      }
      return data;
    }),
    takeUntil(stopSignal$)
  );
}

有时它比抛出错误更简单,更灵活......


推荐阅读