管道在 RxJS 中的作用是什么?

我想我有基本的概念,但有一些模糊

所以一般来说,我是这样使用 Observable的:

observable.subscribe(x => {


})

如果我想过滤数据,我可以使用以下方法:

import { first, last, map, reduce, find, skipWhile } from 'rxjs/operators';
observable.pipe(
map(x => {return x}),
first()
).subscribe(x => {


})

我也可以这样做:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/first';


observable.map(x => {return x}).first().subscribe(x => {


})

所以我的问题是:

  1. 有什么区别吗?
  2. 如果没有区别,为什么函数 pipe存在?
  3. 为什么这些函数需要不同的导入?
130830 次浏览

“ pipeable”(以前的“ lettable”)操作符是自 RxJS 5.5以来使用操作符的 目前推荐的方法

我强烈建议你阅读 管道运营商的正式文件

主要区别在于,它更容易创建自定义操作符,而且在不改变一些全局 Observable对象的情况下,它更容易进行树可移动性,因为如果两个不同的方想创建同名操作符,那么这些对象可能会发生冲突。

对每个操作符 'rxjs/add/operator/first'使用单独的 import语句是制作较小应用程序包的一种方法。通过只导入您需要的运算符而不是整个 RxJS 库,您可以显著减少包的总大小。但是编译器不能知道是否导入了 'rxjs/add/operator/first',因为在代码中确实需要它,或者在重构代码时忘记删除它。这是使用可管道操作符的优点之一,其中未使用的导入将被自动忽略。

管道法

根据原始文件

可管操作符是 以可观察到的事物为基础作为输入并返回另一个可观察值。以前的可观察值保持不变。

pipe(...fns: UnaryFunction<any, any>[]): UnaryFunction<any, any>

原文

什么管子?

类的实例上使用的任何运算符 在 rxjs/operators下可观测的是纯函数。 这使得构建运算符或重用运算符的组合成为可能 变得非常容易,而不必诉诸于各种各样的 编程体操,你必须创建一个自定义观察 扩展可观察,然后覆盖电梯只是为了使自己的定制 东西。

const { Observable } = require('rxjs/Rx')
const { filter, map, reduce,  } = require('rxjs/operators')
const { pipe } = require('rxjs/Rx')


const filterOutWithEvens = filter(x => x % 2)
const doubleByValue = x => map(value => value * x);
const sumValue = reduce((acc, next) => acc + next, 0);
const source$ = Observable.range(0, 10)


source$.pipe(
filterOutWithEvens,
doubleByValue(2),
sumValue)
.subscribe(console.log); // 50

我总结出一个很好的结论:

它将流操作(map、 filter、 reduce...)与核心功能(订阅、管道)分离开来。通过管道操作,而不是链接,它不污染的原型观察使它更容易进行摇树。

参见 https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#why

打补丁的点链接运算符的问题是:

任何导入修补程序运算符的库都将增加 库的所有消费者都可以看到的原型,创造了盲点 如果库删除了它们的使用,它们就会在不知不觉中 打破每个人。与管道,你必须导入操作员 你需要在每个文件中使用它们。

直接打补丁到原型上的操作员不是“可以动摇的树” 通过工具,如汇总或网络包。可管道操作将作为他们 只是直接从模块中提取的函数。

无法检测到在应用程序中导入的未使用操作符 可靠地通过任何类型的构建工具或皮棉规则。这意味着 你可能会导入扫描,但停止使用它,它仍然被添加 使用可管道运算符,如果您没有使用 它,一个线头规则可以帮你捡起来。

函数组合非常棒。构建自己的定制操作符 变得非常,非常容易,现在他们工作,看起来就像所有 你不需要扩展 控制电梯了。

有什么区别吗? 正如您在示例中看到的,主要区别在于提高了源代码的可读性。在您的示例中只有两个函数,但是想象一下如果有十几个函数呢?然后就会像这样

function1().function2().function3().function4()

它真的变得很丑陋,而且很难阅读,特别是当你填充函数内部的时候。除此之外,像 VisualStudio 代码这样的编辑器不允许超过140行的长度。但是如果是这样的话。

Observable.pipe(
function1(),
function2(),
function3(),
function4()
)

这大大提高了可读性。

如果没有区别,为什么存在函数管道? PIPE ()函数的目的是为了 混在一起所有接受并返回可观察的函数。它最初接受一个可观察的函数,然后该可观察的函数将被管道()函数中使用的每个函数使用。

第一个函数获取可观察值,处理它,修改它的值,然后传递给下一个函数,然后下一个函数获取第一个函数的可观察输出,处理它,然后传递给下一个函数,然后继续下去,直到管道()函数中的所有函数都使用可观察值,最后得到处理过的可观察值。最后,您可以执行具有 ordering ()的可观察函数来从中提取值。请记住,原始可观察值中的值不会更改。!!

为什么这些函数需要不同的导入? 导入依赖于在 rxjs 包中指定函数的位置。 它是这样的,所有的模块都以角度存储在 node _ module 文件夹中。 从“模块”导入{ class } ;

让我们以下面的代码为例。我刚用 Stackblitz 写的。因此,没有任何东西是自动生成的,或者从其他地方复制的。当您也可以阅读 rxjs 文档时,我不认为复制 rxjs 文档中的内容有什么意义。我想你问这个问题是因为你没有理解文件。

  • 类导入的映射类的可观察管道 单元。
  • 在类的主体中,我使用了 Pipe ()函数 从代码中可以看出。
  • 函数的作用是: 返回一个可观察的 当它被订阅时按顺序发出数字。

  • 《观察》还没有订阅。

  • 当您使用它的时候,它就像 Obable.tube ()一样,tube ()函数使用给定的 Observer 作为输入。

  • 第一个函数 map ()函数使用这个 Observer,对其进行处理,然后将处理后的 Observer 返回给 tube ()函数,

  • 然后,如果有的话,那么这个处理过的观察值就会给下一个函数,

  • 直到所有的函数都处理可观测的,

  • 在结尾处,可观测的是由管道()函数返回给一个变量,在下面的例子中,它的 obs。

现在可观测的是,只要观测者没有订阅它,它就不会发出任何值。因此,我使用 sub ()函数来订阅这个可观测数据,然后在我订阅它的时候就立即订阅。函数开始发出值,然后通过管道()函数处理它们,最后得到最终结果,例如,1从()函数中取出,1在 map ()函数中加入,然后返回。您可以获得该值,作为订阅(函数(争论){})函数内部的一个参数。

如果要打印它,则使用

subscribe( function (argument) {
console.log(argument)
}
)
    import { Component, OnInit } from '@angular/core';
    import { pipe } from 'rxjs';
    import { Observable, of } from 'rxjs';
    import { map } from 'rxjs/operators';
   
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: [ './app.component.css' ]
    })
    export class AppComponent implements OnInit  {
   
      obs = of(1,2,3).pipe(
      map(x => x + 1),
      );
   
      constructor() { }
   
      ngOnInit(){  
        this.obs.subscribe(value => console.log(value))
      }
    }


Https://stackblitz.com/edit/angular-ivy-plifkg

这就是我如何解释可观察到的:

你需要根据天气情况制定一个计划,这样你就可以打开收音机,收听一个全天候播放天气情况的天气频道。在这个场景中,不是获得单个响应,而是响应正在进行。这种反应就像订阅一个可观察的。可观测的是“天气”,订阅的是“让你随时了解最新情况的无线电信号”。只要你的无线电还开着,你就能收到所有可用的最新消息。在你关掉收音机之前,你不会错过任何信息。

我说天气是可以观测到的,但是你听的是收音机而不是天气。所以无线电也是可观测的。天气播报员所说的是气象学家发给他的天气报告的作用。气象学家写的是来自气象站的数据的函数。来自气象站的数据是所有仪器(气压计、风速计、风速计)的功能,仪器是气象本身的功能。

在这整个过程中至少有5个可观察到的现象。在这个过程中,有两种类型的观察。可观测源和可观测输出。在这个例子中,天气是“可观测的源”,无线电是“可观测的输出”。中间的部分代表 PIPE FUNCTION

管道函数 是指对源可观测数据执行操作,以提供输出可观测数据,所有这些操作都发生在源可观测数据内部。所有的操作都是针对观察对象的