rxjs 错误处理 > catchError 源停止发出

2023-11-21

我对 rxjs 有点困惑catchError操作员。这是一个使用 Angular 的简单示例:

(现场演示here)

import { Component } from '@angular/core';
import { of, timer } from 'rxjs'
import { tap, catchError } from 'rxjs/operators'

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
})
export class AppComponent {
  constructor() {
    const source$ =  timer(1000, 1000).pipe(tap(n => {
      if (n === 3) {
        throw new Error('n === 3')
      }
    }))

    this.value$ = source$.pipe(catchError(err => {
      return of(42)
    }))
  }

  value$
}

{{ value$ | async }}

The source$异步管道订阅的 observable 发出 0,1,2,然后发出错误。该错误被捕获在catchError运算符默默地吞下错误并发出 42。我想我明白这一点。然而,发射随后停止(我期待 4、5、6,...)。有人可以解释为什么这种情况不会发生以及是否有任何方法可以实现这种行为?

这在实践中对我来说很重要,在如下情况下,我们每次发出路由参数时都会加载新数据。假设我们导航到引发错误的路线(例如 404、500,...),我不希望事件流停止发出,因为这样我就无法导航回任何其他页面。我只想优雅地处理错误并继续侦听路线更改。

this.foo$ = this._route.params.pipe(
  map(params => params.id),
  switchMap(id => this._fooServerClient.getOneById(id)),
  catchError(err => {
    return of(undefined)
  })
)

这是 Observable 的设计初衷,如果 Observable 管道中发生异常,相应的 observable [引发错误] 将处于错误状态,并且无法发出新的/进一步的值 [即就像取消订阅一样]。

现在,为了让你的外部可观察的保持活跃[即。继续发出新值]然后处理内部可观察的错误[即使用catchError内部可观察管道中的运算符如下所示:

this.foo$ = this._route.params
                .pipe(
                      map(params => params.id),
                      switchMap(id => {
                          return this._fooServerClient.getOneById(id)
                                     .pipe(
                                      catchError(err => {
                                        return of(undefined);
                                      })
                                     )
                        }),

                );

Having catchError在内部可观察管道中将使外部可观察保持活动状态[即即使内部可观察抛出异常,也要继续发出新值]。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rxjs 错误处理 > catchError 源停止发出 的相关文章

  • Angular 2 管道状况良好

    Angular 2 是否可以在一定条件下应用管道 我想做这样的事情 variable text variable value SomePipe OtherPipe 如果不是 达到这种效果的首选方法是什么 您需要稍微更改一下语法 variab
  • 是否有任何有角度的日期前管道?

    我正在尝试创建帖子共享网站 我想以角度创建日期前管道 import Pipe PipeTransform from angular2 core Pipe name messageTime pure false export class Me
  • 在 Flurry 中记录比错误 ID 更多信息的方法?

    我目前使用 iOS 版 Flurry 5 4 0 我担心在方法方面是否能够记录更多信息 而不仅仅是错误 ID void logError NSString errorID message NSString message error NSE
  • 如何使用“*ngIf else”?

    我正在使用 Angular 并且我想使用 ngIf else 自版本 4 起可用 在此示例中 div content here div div other content here div 我怎样才能实现相同的行为ngIf else 角度
  • RxJ 从 observable 中获取价值

    在组件中 singleEvent Observable
  • ngx-DataTable 对列进行排序无法正常工作 Angular 4

    虽然我对角度非常陌生 但我在使用 ngx DataTable 时遇到了一些困难 我使用简单的 ngx DataTable 进行简单的操作 问题出在列上 尽管我已将 attr 声明为 sortable true 但排序不起作用 这是代码 表定
  • 表单提交后 Angular2 更新视图

    我正在使用 Angular2 创建一个简单的 CRUD 应用程序 该应用程序由一个列出当前记录的表格和一个用于提交新记录的表格组成 提交表单后更新表格以反映新记录的正确方法是什么 这是我到目前为止所拥有的 export class Pers
  • 无法重新加载/刷新活动路线

    我最近更新了新的 RC3 和 Router3alpha 似乎有些事情发生了变化 我注意到单击活动路径的链接不再导致组件重新加载 如何使用新的 router3 实现此行为 我的链接看起来像 a Link1 a 为了测试我只是在 ngOnIni
  • Angular 2 中的变更检测

    我正在将角度 1 和角度 2 集成在一起 因此我有角度 1 控制器和服务以及角度 2 组件 这些对于数据检索和存储来说工作得很好 反之亦然 下面是我的 html 页面 h3 Angular 1 service h3 div div
  • 根据 main.ts 中的 URL 引导多个或单个模块

    我正在使用一个 NET Framework MVC Web项目 该项目无法完全转移到完整的角度项目 因此我无法使用角度的路由来延迟加载 但我也不想加载使用角度组件的所有内容 这是一个企业解决方案 要说 嘿 让我们充分利用 Angular 并
  • 使用 Angular2 Router 发出 router.navigate 时出现无限重定向循环

    Note使用相关代码片段进行编辑 我遇到了一个奇怪的问题 在发出 router navigate 时 我进入了无限重定向循环 Setup 我使用哈希位置策略 并且该应用程序用作 Outlook 插件 I have three routing
  • Angular 2获取元素高度

    我这里有一个非常简单的例子 它只是一个带有单个 div 的角度应用程序 是否可以获取div的角度高度 我想我可以用 ViewChild 和 offsetHeight 来做到这一点 import Component ElementRef Vi
  • 相当于 $q.when 在角度 2 中

    我习惯使用 q使用角度 1 我正在迁移到角度 2 是否有等效的提供 when 方法 例如我需要迁移这个 service updateProDB rootScope connectionStatus q storageService send
  • 非闪亮上下文中的反应式对象绑定

    实际问题 你怎样才能近似反应性环境 行为 http shiny rstudio com tutorial lesson6 建立者shiny http shiny rstudio com函数 或者甚至可能在一个函数中使用这些函数无光泽上下文以
  • Angular 2 - 内容未加载到路由器插座中

    我对 Angular 2 还是很陌生 希望你们能帮助我 我有一个相当简单的应用程序 有一个登录页面 成功登录后用户将被定向到带有侧菜单的页面 登录屏幕没有此侧边菜单 当用户注销时 他会再次被引导至登录页面 问题是登录后侧菜单变得可见 但其他
  • 用输入字段 Javascript/Angular2 替换某些单词

    我有一根绳子 我喜欢橙色 蓝色 黑色 粉色 玫瑰色 黄色 白色 黑色 是否可以用输入字段替换黄色和黑色 以便我可以输入自己的颜色 const a string I like orange blue black pink rose yello
  • 在 Angular 中刷新 owl-carousel

    我对猫头鹰旋转木马有一些关于动态变化的问题 例如幻灯片的数量等 换句话说 旋转木马在进行一些更改后很容易损坏 我的方法是重新加载 刷新轮播 但如何呢 我在网上发现必须按班级刷新 owl trigger refresh owl carouse
  • 当可观察值可用时,UI 不会自动更新

    在 angular2 中 我创建了可观察的 uploadProgressStatus 它接受数字 使用异步管道 我想在 UI 上显示数字 并在输入新值时自动更新 请参阅下面的代码 home component ts 正在观察 upload
  • 应用程序 Angular2 外部的路由

    我在 Angular2 中有一个应用程序 我需要在应用程序外部导航 我有简单的看法 a target blank library url a 我想导航到library url 我有导航方法 goToPage url string What
  • 从 Angular2 模块导出时遇到问题

    我是 Angular 2 的初学者 我试图了解如何从功能模块导出类 并将其导入到我的主模块中 当我尝试在打字稿中编译它时 我收到以下两个错误 app app component ts 11 21 错误 TS2304 找不到名称 添加服务 a

随机推荐