什么是 Angular 中的 pipe() 函数

Posted

技术标签:

【中文标题】什么是 Angular 中的 pipe() 函数【英文标题】:What is pipe() function in Angular 【发布时间】:2018-06-10 08:13:33 【问题描述】:

管道是用于转换模板中的数据(格式)的过滤器。

我遇到了pipe() 函数,如下所示。在这种情况下,这个pipe() 函数究竟意味着什么?

return this.http.get<Hero>(url)
  .pipe(
    tap(_ => this.log(`fetched hero id=$id`)),
    catchError(this.handleError<Hero>(`getHero id=$id`))
);

【问题讨论】:

github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md @Ajay 我得到了这个页面和一堆对 | 的引用用途。哪个没有回答 rxjs 管道是什么。 【参考方案1】:

您在开始描述中谈论的管道与您在示例中显示的管道不同。

如您所说,在 Angular(2|4|5) 中,管道用于格式化视图。我认为您对 Angular 中的管道有基本的了解,您可以通过此链接了解更多信息 - Angular Pipe Doc

您在示例中显示的pipe()RxJS 5.5pipe() 方法(RxJS 是所有Angular 应用程序的默认值)。在 Angular5 中,所有的 RxJS 操作符都可以使用单一导入来导入,现在它们可以使用管道方法进行组合。

tap() - RxJS 的点击操作符将查看 Observable 值并使用该值做一些事情。换句话说,在成功的 API 请求之后,tap() 运算符将执行您希望它对响应执行的任何功能。在示例中,它只会记录该字符串。

catchError() - catchError 做同样的事情,但有错误响应。如果您想抛出错误或遇到错误时想调用某个函数,您可以在此处进行。在示例中,它将调用handleError(),在其中,它只会记录该字符串。

【讨论】:

“管道是用于转换模板中的数据(格式)的过滤器。”在这里,他在谈论 Angular 2+ 中的管道,例如日期,Angular 中提供的大写管道(这正是他所说的,即模板中的格式数据)并且在描述中他展示了 RXJS 管道 function的示例>。所以是的,这两件事完全不同。 我把它收回,我是过失。忽略了那句话。我希望我可以撤消-1。 :(但不幸的是它被锁定了。 这没什么大不了的。很高兴它消除了所有的疑虑。干杯:-)【参考方案2】:

不要混淆 Angular 和 RxJS 的概念

我们在 Angular 中有管道概念,在 RxJS 中有 pipe() 函数。

1) Angular 中的管道:管道将数据作为输入并将其转换为所需的输出https://angular.io/guide/pipes

2) RxJS 中的pipe() 函数:您可以使用管道将运算符链接在一起。管道让您可以将多个函数组合成一个函数。

pipe() 函数将您要组合的函数作为其参数,并返回一个新函数,该函数在执行时按顺序运行组合函数。https://angular.io/guide/rx-library(在此 URL 中搜索管道,你可以找到相同的)

所以根据你的问题,你指的是 RxJS 中的 pipe() 函数

【讨论】:

【参考方案3】:

您必须查看官方 ReactiveX 文档: https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md.

这是一篇关于 RxJS 中管道的好文章: https://blog.hackages.io/rxjs-5-5-piping-all-the-things-9d469d1b3f44.

简而言之,.pipe() 允许链接多个可管道操作符。

从 5.5 版开始,RxJS 已经发布了“管道操作符”并重命名了一些操作符:

do -> tap
catch -> catchError
switch -> switchAll
finally -> finalize

【讨论】:

【参考方案4】:

RxJS 操作符是建立在 observables 基础上的函数,可以对集合进行复杂的操作。

例如,RxJS 定义了map()filter()concat()flatMap() 等运算符。

您可以使用管道将运算符链接在一起。管道让您可以将多个函数组合成一个函数。

pipe() 函数将您要组合的函数作为其参数,并返回一个新函数,该函数在执行时按顺序运行组合函数。

【讨论】:

你有例子吗? 在下面的例子中,我们通过管道传递了过滤器和映射函数。现在这两个函数将按示例中提供的顺序执行。首先它将过滤结果,然后将映射结果。希望它会有所帮助。从'rxjs/operators'导入过滤器,地图; const squareOdd = of(1, 2, 3, 4, 5) .pipe( filter(n => n % 2 !== 0), map(n => n * n) ); // 订阅获取值 squareOdd.subscribe(x => console.log(x));【参考方案5】:

两种截然不同的管道 Angular - PipesRxJS - Pipes

Angular-Pipe

管道将数据作为输入并将其转换为所需的输出。在此页面中,您将使用管道将组件的生日属性转换为人类友好的日期。

import  Component  from '@angular/core';

@Component(
  selector: 'app-hero-birthday',
  template: `<p>The hero's birthday is  birthday | date </p>`
)
export class HeroBirthdayComponent 
  birthday = new Date(1988, 3, 15); // April 15, 1988

RxJS - Pipe

Observable 运算符是使用称为 Pipeable Operators 的管道方法组成的。这是一个例子。

import Observable, range from 'rxjs';
import map, filter from 'rxjs/operators';

const source$: Observable<number> = range(0, 10);

source$.pipe(
    map(x => x * 2),
    filter(x => x % 3 === 0)
).subscribe(x => console.log(x));

控制台的输出如下:

0

6

12

18

对于任何持有 observable 的变量,我们可以使用 .pipe() 方法传入一个或多个运算符函数,这些函数可以处理和转换 observable 集合中的每个项目。

因此,此示例将 0 到 10 范围内的每个数字乘以 2。然后,过滤器函数将结果过滤为仅奇数。

【讨论】:

感谢您提供有关用法的日常示例。大多数其他答案只是关于 RxJS 的概念解释。

以上是关于什么是 Angular 中的 pipe() 函数的主要内容,如果未能解决你的问题,请参考以下文章

Angular管道PIPE介绍

编号 Pipe - Angular 2 的参数是啥

Angular JS,带有选择框的过滤表

Hello Angular — Pipe

angular报错:Please add a @Pipe/@Directive/@Component annotation

Angular - 管道函数中断执行流程