我发现,当一个可观察到的错误,它不再发出任何值.那么,我应该如何在我的模板中使用一个在某些情况下可能出错(包含http调用或任何东西)的可观测对象呢?

比方说,我有一个主题,它包含一个由输入给出的字符串,还有一个http调用的SwitchMap.由于用户输入错误而导致的HTTP调用错误.现在,当我使用另一个用户输入对主题调用Next时,将不会执行SwitchMap+http调用,因为可观测对象处于错误状态.CatchError也不起作用.


  string$ = new Subject<string>();
  errorS$ = this.string$.pipe(switchMap(s =>
    s == '1' ?
      throwError('mein eroor') : 
      of(s)
  )).pipe(catchError(() => EMPTY))

  constructor(){
    timer(1000, 2000)
      .pipe(take(3))
      .subscribe(i => {
          console.log(i)    
          this.string$.next("" + i)
      })
  }

在本例中,当我在模板中使用Errors$时,它在出错后不再更新.那么,如何让它再次更新,我从哪里得到我的错误.

Example on Stackblitz

推荐答案

您需要在PIPE中使用retry来重新订阅错误的PIPE

  string$ = new Subject<string>();
  errorS$ = combineLatest({ s: this.string$ }).pipe(
    mergeMap(({ s }) => (s == '1' ? throwError('test') : of(s))),
    retry()
  );

  constructor() {
    this.errorS$.subscribe((result) => console.log(result));
    this.string$.next('0');
    this.string$.next('1');
    this.string$.next('2');
  }

正如您在控制台输出中看到的那样,0和2表示errorS$管道正在运行!

Angular相关问答推荐

Angular - MSAL用户缺少角色

使用路由进行测试.为每次测试导航堆栈

Angular 信号效果,try 重置表单并获取在计算或效果中不允许写入信号"

iOS Mobile Safari - HTML5视频覆盖一切

使用注入的主机组件进行指令测试

首期日历发行

如何在Angular功能路由保护中取消订阅RxJs主题

等待可观察性完成后再调用下一个

如何处理后端删除元素后元素列表的刷新

如何在运行Angular应用程序的容器中访问Docker容器?

为什么Angular的ViewEncapsulation枚举有没有值为1的键?

升级到 Webpack 5.79.0 后 NX Angular 项目构建失败

Angular:显示带有嵌套子项的内容投影

Angular Material 模态对话框周围的空白

将 Angular 5 升级到 6 时,我得到不兼容的对等依赖(使用 ng update @angular/core)

MatToolbar 与 Angular 9 一起使用时抛出错误

Mat-autocomplete - 如何访问选定的选项?

如何在 angular2 中的 div 的 contenteditable 上使用 [(ngModel)]?

如何在 Angular 4 中翻译 mat-paginator?

Angular2:将数组转换为 Observable