Heroes 教程中的 Angular RXJS CatchError

2024-01-08

我正在运行 Angular 教程,但我无法理解某一部分中实际发生的情况。我通过搜索找到了一些例子,但没有具体回答这个问题。这是代码:

getHeroes (): Observable<Hero[]> {
  return this.http.get<Hero[]>(this.heroesUrl)
    .pipe(
      catchError(this.handleError('getHeroes', []))
    );
} 

接下来是它调用的错误处理程序:

/**
 * Handle Http operation that failed.
 * Let the app continue.
 * @param operation - name of the operation that failed
 * @param result - optional value to return as the observable result
 */
private handleError<T> (operation = 'operation', result?: T) {
  return (error: any): Observable<T> => {

    // TODO: send the error to remote logging infrastructure
    console.error(error); // log to console instead

    // TODO: better job of transforming error for user consumption
    this.log(`${operation} failed: ${error.message}`);

    // Let the app keep running by returning an empty result.
    return of(result as T);
  };
}

我阅读了在 catchError 上可以找到的文档。我是 Typescript 的新手,但我真的很喜欢它。好的,问题是为什么我将一个函数传递给 catchError,然后它返回另一个函数。具体来说,我的问题是关于嵌入式功能return (error: any): Observable<T> => {

为什么handleError返回一个带有粗箭头表示法的函数而不是仅仅一个T类型的可观察值?嵌入函数接收数据的error参数如何?

我认为这与调用handleError有关,它返回一个函数。所以本质上 catchError 接收带有参数 error 的嵌入函数,但它也有变量operation and result?在相同的范围内,因此它可以与这些一起工作。 catchError 然后将数据传递给参数 error 并返回一个可观察的 T。

RXJS 参考将 catchError 定义为:

catchError<T, R>(selector: (err: any, caught: Observable<T>) =>
ObservableInput<R>): OperatorFunction<T, T | R>

但我很难解释为什么它会像所有示例一样被传递给一个函数。


你的假设是正确的:handleError首先调用函数,它本身创建一个用于处理错误的函数。还有其他几种写法可能有助于澄清一些:

// write the function inline:
catchError(error => {
  console.error(error);
  this.log(`getHeroes failed: ${error.message}`);
  return of([]);
});

// call `handleError` first to get the error handler and pass it as a variable.
const errorHandler = this.handleError('getHeroes', []);
return this.http.get<Hero[]>(this.heroesUrl)
  .pipe(catchError(errorHandler));

catchError需要一个function传递给它,返回一个 Observable 以继续可观察流。返回的可观察量是由创建的of。类型 T 允许错误处理程序根据您传入的后备参数确定 Observable 发出的值的类型。

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

Heroes 教程中的 Angular RXJS CatchError 的相关文章

随机推荐

  • 每个分支基于作业的安全性 - Jenkins 多分支管道

    我有一个用于构建工件的 Jenkins 多分支管道 并且有用于master dev etc 我想在每个分支的基础上启用基于项目的安全性 即只允许开发人员运行 dev构建的分支作业而不是任何其他作业 因为这样做会产生不良影响 我知道有基于项目
  • Linux IOMMU 页表

    我一直在读关于IOMMU https en wikipedia org wiki Input E2 80 93output memory management unitLinux 中的支持 并对 IOMMU 中的页表有一些疑问 IOMMU
  • Oracle SQL Developer 在哪里存储连接?

    我的应用程序无法连接到 Oracle Database 11g Express Edition 我在此版本中创建了一个测试数据库 我可以使用 Oracle SQL Developer 很好地连接到数据库 创建表 视图等 但是 我很难通过我的
  • 散景热图的使用

    我有一系列带有时间戳的某些事件 并且想要创建一个热图 x 轴应代表日期 例如 2016 02 03 y 轴应代表发生的时间 例如13 如果 13 32 颜色应取决于发生事件的计数 我的数据 作为 pandas 数据框z head date
  • 为什么 java.util.concurrent.ArrayBlockingQueue 在调用await() 时使用“while”循环而不是“if”?

    我一直在玩我自己的版本 使用 if 一切似乎都工作正常 当然 如果使用 signalAll 而不是 signal 这会严重崩溃 但如果一次只通知一个线程 这怎么会出错呢 他们的代码here http fuseyism com classpa
  • 将文本文件中的数字列表转换为整数

    我有一个在文本文件中从左到右读取的数字列表 我试图让 Python 将它们作为数字列表读取 以便我最终可以将它们绘制成图表 我一直在尝试各种字符串 pickle 和字节到字符串代码 但不可避免地会出现错误 数字的例子 20494 20461
  • 使用 pymongo 在 mongodb 上插入 $currentDate

    我需要测试服务器 mongodb 的准确性 我正在尝试插入一系列数据 花点时间将其发送到数据库以了解其何时插入 我正在尝试这个 usr bin python from pymongo import Connection from datet
  • 日历事件的可视化。以最大宽度布局事件的算法

    我需要你的算法帮助 它将在客户端使用 JavaScript 开发 但这并不重要 我最感兴趣的是算法本身 布局日历事件 以便每个事件框都有最大宽度 请看下图 Y 轴是时间 因此 如果 测试事件 从中午开始 例如 并且没有其他内容与其相交 则它
  • 如何在不使用 sudo 的情况下安装 virtualenv?

    I have easy install and pip 我的错误很多Linux 薄荷 12 我刚刚重新安装了它 我想再次从头开始安装所有内容 This https stackoverflow com questions 9340637 is
  • 获取 URL 中传递的变量 Laravel

    可能是一个基本问题 但我似乎无法理解 我想将我的 url 中的变量抓取到我的控制器 索引视图 foreach paymentInfos as p tr td a href p gt order id a td td p gt lastnam
  • CSS-Grid:如果侧边栏为空,则拉伸主网格

    我对包含侧边栏的简单网格布局有一些样式问题 aside 还有一些main内容
  • navigatorKey.currentContext 始终为 Null

    我想在收到 FCM 后台消息时切换到屏幕 但对于这个context是必需的 但我里面绝对没有FirebaseBackgroundMessageHandler所以在网上搜索后我发现我可以从NavigatorKey所以我创建了这个全局变量 fi
  • Python 圆周率计算?

    我是 python 初学者 我想计算 pi 我尝试使用 Chudnovsky 算法 因为我听说它比其他算法更快 这是我的代码 from math import factorial from decimal import Decimal ge
  • 使用 Pip 将软件包安装到 Anaconda 环境

    康达4 2 13 MacOS X 10 12 1 我正在尝试从安装包pip到使用 anaconda 创建的新环境 虚拟 在 Anaconda 文档中 http conda pydata org docs using pkgs html in
  • AudioOutputUnitStart 非常慢

    我有一个播放单声道音频事件的代码 各种频率的短蜂鸣声 我创建一个 AudioOutputUnit 并在需要播放音频时停止它 我开始它 当我玩到规定的时间后 我就会停止它 听起来很简单 然而 在我的 iPhone 4S 使用 iOS 5 1
  • 通过服务器端处理从数据表中导出所有内容?

    我有使用 DataTables 服务器端处理的表格在我的网站上显示 我希望能够 导出全部 并导出所有行 而不仅仅是显示的那些行 有 60000 行和 65 列 因此必须通过服务器端处理来完成 我尝试了一些方法 但到目前为止没有任何效果 我已
  • 为什么我的代码使用逻辑表达式作为 case 标签会抛出错误?

    switch at case at gt 0 at lt 5 printf Average Time Taken Hrs n d 0 at printf Your Salary is Rs d pj 1500 5000 break 其余代码
  • OverflowError:在 pandas 系列图上格式化日期时,int 太大而无法转换

    我正在尝试绘制 pandas 系列 但当我尝试格式化 x 轴日期时遇到错误 相关的issue https stackoverflow com questions 26642133 why do i get python int too la
  • 在 django Css 中使用自定义字体

    我正在尝试在 Django 应用程序中使用自定义字体 以下是我的 base html 中的相关行 load static 这是我的 css 文件 font face font family FiraCode Retina src url f
  • Heroes 教程中的 Angular RXJS CatchError

    我正在运行 Angular 教程 但我无法理解某一部分中实际发生的情况 我通过搜索找到了一些例子 但没有具体回答这个问题 这是代码 getHeroes Observable