操作员 - 获得用RXJ治疗数据流的能力
#javascript #网络开发人员 #angular #rxjs

操作员或操作员是您获得数据流的能力。

不是很有趣,您可以创建一个数据流,如果您在这两个点之间什么都不做,可以在某个地方接收此流程。

因此,这是操作员进入的地方,它们几乎就像过滤器。声明功能。

您有一个由lib rxjs提供的运营商集合或根据需要开发的,操作员是处理流量提供的数据的等级。

用于构建操作员,我们使用纯函数的概念使用功能范式。

运营商是功能,仅此而已,无非是功能

import { of, map } from 'rxjs';

of(1, 2, 3)
  .pipe(map((x) => x * x)) // o map é nosso operator nesse fluxo.
  .subscribe((v) => console.log(`value: ${v}`));

现在,我们刮擦对操作员的理解,我们将真正谈论它们。

有两种类型的操作员

管道操作员:是可以将可以通过过滤器传递到可以通过过滤器的东西的管道在第一个可观察的。

const observable = new Observable(function subscribe(subscriber) {
  const id = setInterval(() => {
    subscriber.next(1)
        subscriber.next(2)
        subscriber.next(3)
  }, 1000);
});

observable
    .pipe(map(v) => v * v) // A funcao executada dentro do pipe, no caso o map e um Pipeable Operator
    .subscribe((v) => console.log(`value: ${v}`));

    // value: 1
    // value: 4
    // value: 9 

可在可观察的输入并返回另一个可观察的纯函数的可管道操作员和一个纯函数,因为剩下的先前可观察到的函数不会进行任何修改。< /p>

管道操作员也可以通过以前已经看到的管道方法链接的方式进行。

observable
    .pipe(
        operator1(),
        operator2(),
        operator3(),
    )
    .subscribe((v) => console.log(`value: ${v}`));

创建操作员创建操作员是自主函数,可以称呼它可以使用某些某些预定义的行为或结合其他可观察到的可观察到。

示例:

import { of, map } from 'rxjs';

of("a", "b", "c") // of gera um Observable que emite um valor após o outro
.pipe(map((v) => `${v}1`))
.subscribe((v) => console.log(value: ${v}));

// value: a1
// value: b1
// value: c1

高阶可观察到

一个可观察的可能会发出诸如字符串和否。查看以下风景。

我们有一个可观察的可读取一定直接以获取所有文本文件的可见。

const fs = require('fs');
const path = require('path');
const { Observable } = require('rxjs')

function readDirectory(pathDir) {
  return new Observable(subscriber => {
    try {
      let files = fs.readdirSync(pathDir)
      files = files.forEach(file => {
        subscriber.next(path.join(pathDir, file))
      })
      subscriber.complete()
    } catch (error) {
      subscriber.error(error)
    }
  })
}

好吧,我们有一个可观察的。

现在我们有了文件,我们如何通过一些修改以流形式读取这些文件的包含?创建另一个可观察的,但在这种情况下是可管道的操作员。

function createPipeableOperator(operatorFN) {
  return function name(source) {
    return Observable.create(subscriber => {
      const sub = operatorFN(subscriber)
      source.subscribe({
        next: sub.next,
        error: sub.next || (e => subscriber.error(e)),
        complete: sub.complete || (v => subscriber.complete()),
      })
    })
  }
}

从createpable -opector函数中,我们可以创建新功能,例如在读取直接数据时可以扮演角色的观察值,例如仅从某个扩展中读取文件。

// ler o arquivo.
function readFile() {
  return createPipeableOperator(subscriber => ({
    next(pathFile) {
      try {
        const content = fs.readFileSync(pathFile, { encoding: 'utf-8' })
        subscriber.next(content.toString());
      } catch (error) {
        subscriber.error(error)
      }
    }
  }))
}

//ler com uma determinada extensão.
function getFilesWithExtension(extension) {
  return createPipeableOperator(subscriber => ({
    next(text) {
      if (text.endsWith(extension)) {
        subscriber.next(text)
      }
    }
  }))
}

最后执行此程序,我们在这些结构中有一些内容。

readDirectory(./caminho_do_diretorio)
  .pipe(
    getFilesWithExtension('.txt'),
    readFile(),
  )
  .subscribe(console.log)

这样,我们将能够使用可观察到的.txt扩展名中的一个直接读取文件,这似乎是复杂的,但是要比其他任何事情都多。

操作员类别

您现在可以了解使用操作员可以做的可能性范围,因为有运营商的最多样化的提案分为徒劳的类别过滤器,加入,多播种等。

遵循link da documentação oficial,以便您可以探索操作员的更多信息