javascript - 停止错误关闭的 Angular http Observable 流

标签 javascript angular rxjs reactive angular-httpclient

我有一个主题 (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) 返回一个新的可观察对象,我不认为处理错误会是一个问题,但似乎这会从 this.searchSubject 中删除所有观察者。

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

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

最佳答案

您的错误处理程序位于外部 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));
});

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

如果您继续使用旧语法,我认为在您的 .map() 投影之后添加一个 .catch 会很简单。

关于javascript - 停止错误关闭的 Angular http Observable 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49779279/

相关文章:

javascript - 将 Markdown 文件转换为 PDF,同时剥离 Jekyll Front-Matter

javascript - 将原始数据传递给 pdf JS 而不是 url?

javascript - 调整 html 表格列的大小 (TD)

json - 有没有办法在 Angular 2 中以可折叠格式显示有效的 json?

javascript - 根据鼠标点击位置定位 div

javascript - 类型错误 : Cannot read property '0' of undefined in angular2 for using index in datepicker

Angular 2 使用 ngrx + RxJS 订阅多个组件/路由来填充存储

angular - 如何在 Angular 组件中使用 debounceTime?

javascript - 使用 Bit.ly API 仅使用 Javascript 来缩小 URL

javascript - 向 Observable 发射新值