【问题标题】:Stop Angular http Observable stream closing on error停止 Angular http Observable 流在错误时关闭
【发布时间】:2018-04-11 15:41:17
【问题描述】:

我有一个主题 (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,它会为每个返回的错误返回一个抛出的错误。

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

【问题讨论】:

  • 您使用的是哪个rxjs 版本?
  • 5.5.2 以上

标签: javascript angular rxjs reactive angular-httpclient


【解决方案1】:

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

如果您保留旧语法,我认为在您的 .map() 投影之后添加 .catch 一样简单。

【讨论】:

  • 谢谢你,我发现正如你所说,外部 observable 已被关闭,现在只是尝试像你一样获得我的解决方案,虽然我没有看到 catchError,这是否意味着没有错误将被引发到 searchSubject?
  • catchError 只是旧 catch 的重命名,因为后者是保留关键字。没错,你必须处理里面的错误。
  • 你得给catchError返回一些东西,所以我返回一个Observable.of(err),它调用订阅中的success方法。知道如何避免退货吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多