我有点被pipe号操作员和map号链锁搞糊涂了.以下两个例子在功能上是否相同?管道功能的目的或优点是什么?

const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .pipe(
    retry(3, 1000),
    map(employee => employee.name),
    catchError(error => of(null))
  );
const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .let(retry(3, 1000))
  .map(employee => employee.name)
  .catch(error => Rx.Observable.of(null));

推荐答案

使用pipe的"新"方式称为lettable运算符Pipeable Operators.使用"补丁操作符"链接操作符的"旧"方法称为"补丁操作符".

从版本5.5开始,我们提供了"可管道运算符",它可以在rxjs/operators中访问(请注意复数形式的"运算符").与rxjs/add/operator/*中的"补丁"运算符相比,这些运算符是一种更好的方法来仅引入您需要的运算符.

大约有problems with the patch operators人.它们还可以确保代码生成的包更小.还有其他的优点,请看documentation,它很好地涵盖了这一点.

不过,为了回答您的另一个问题,您的两个代码示例在功能上是等效的.此外,只要有可能,您应该使用Pipeable操作符而不是Patch操作符.


documentation(for completeness)

点链的修补运算符存在以下问题:

  1. 任何导入补丁运营商的库都会为该库的所有使用者增加Observable.prototype,从而产生盲目依赖.如果图书馆删除了它们的使用,它们会在不知不觉中 destruct 其他所有人.使用PipeTables时,必须将所需的运算符导入到使用它们的每个文件中.
  2. 直接修补到原型上的操作员不能通过rollup或webpack等工具"摇树".可通过管道传输的操作器将是直接从模块中拉入的函数.
  3. 任何类型的构建工具或lint规则都无法可靠地检测应用程序中导入的未使用的运算符.这意味着您可能会导入scan,但停止使用它,它仍然会被添加到输出包中.对于可管道操作符,如果您不使用它,一个皮棉规则可以为您拾取它.
  4. 功能性构图很棒.构建自己的自定义操作符变得越来越容易,现在它们可以工作,看起来就像rxjs中的所有其他操作符一样.您不再需要扩展Observable或覆盖lift.

Angular相关问答推荐

Toastr在独立组件上的Angular17实现

如何使用ChangeDetectionStrategy.OnPush?

成Angular 的嵌套router-outlet

我应该对我想要在我的Angular 17+组件中显示的任何变量使用信号吗?

Ngrx Select 器返回部分对象

阶段JS画布覆盖 bootstrap 模式

用于 React 的 ngx-extended-pdf-viewer

NG-Zorro Datepicker 手动输入掩码不起作用

Angular 信号 - 使用 mutate() 与使用 forEach() react 性

Angular 15:在范围内提供相同标记时附加到提供的值

Angular14:支持旧版浏览器的官方方式是什么?

检测父元素是否绑定到 Angular 中的子元素 @Output

个人修改 Angular CLI - 创建新应用

异步管道模板中的局部变量(Angular 2+)

如何修复 [Object: null prototype] { title: 'product' }

URL 清理导致嵌入式 YouTube 视频的刷新

angular 2模板使用console.log

在 Angular 2 中打印 Html 模板

无法在 RxJs 6 和 Angular 6 中使用 Observable.of

为什么 Angular 项目中没有 Angular-CLI 为 model生成命令?