停止Angular http Observable流关闭时出错

时间:2018-04-11 15:41:17

标签: javascript angular rxjs reactive angular-httpclient

我有一个Subject(this.searchSubject),当我想执行搜索时,我打电话给next():

this.searchSubject.next(postBody)

这会导致以下情况发生:

this.searchSubject
      .switchMap((view: any) => {
         // upsert here records the search - needed
         return this.searchHistoryService.upsert(view)
          .flatMap(() => this.http.post(this.url, view))
          .map((data) => this.pageTransform(data));
      })
      .subscribe(res => {
        this.successSubject.next(this.pageTransform(res));
      }, err => {
        this.errorSub.next(err);
      });

不幸的是,无论我做什么,如果调用this.errorSub.next(err);(错误条件),我似乎无法保持流存活。

由于httpClient(this.http.post)返回一个新的observable,我不会想到处理错误将是一个问题,但它似乎从this.searchSubject中删除所有观察者。

注意我有一个httpInterceptor,它返回每个返回错误的抛出错误。

这一定是一个非常常见的模式,所以我做错了什么?

1 个答案:

答案 0 :(得分:3)

您的错误处理程序位于外部switchMap投影中,因此如果发生错误,它将关闭外部流。你必须将它移到你的switchMap以保持外部流的活着。

由于您使用的是rxjs@5.5.2,因此可以使用lettable运算符,这样可以更轻松地查看错误处理程序的放置位置。

this.searchSubject.pipe(
  switchMap((view: any) => {
   return this.searchHistoryService.upsert(view)
    .pipe(
      flatMap(() => this.http.post(this.url, view)),
      map((data) => this.pageTransform(data)),
      catchError(() => {
        this.errorSub.next(err); 
      })
    );
  })
).subscribe(() => {
  this.successSubject.next(this.pageTransform(res));
});

如果切换到lettable运算符,一个重要的注意事项是,您必须从rxjs/operators import { map, catchError } from 'rxjs/operators'; 中导入它们。

如果您使用旧语法,我认为在您的.catch投影后添加.map()非常简单。