RxJS过滤数据流操作符学习 (Filtering Operators)

1. 过滤类操作符的模式

很多时候,上游Observable对象吐出的数据,并不是下游关心的,这个时候我们需要把不需要的数据,过滤掉。在RxJS中,提供了这类过滤操作符来实现这种功能。

过滤类操作符最基本的功能就是对一个给定的数据流中的每个数据判断是否满足某个条件,如果满足就传递给下游,如果不满足就抛弃。

判断一个数据是否有资格进入下游,是根据 “判定函数”的返回值, true代表可以进入下游,否则就会被淘汰。

有的过滤类操作符还可以接受一个函数参数“结果选择器”,用来制定数据给下游,比如:

function resultSelector(value,index){
    return [value,index]
}

  • filter

和Array.prototype.filter()很像,看一下使用方法, filter 只能做过滤,不能做结果转化

import {fromEvent} from 'rxjs';
import {filter} from 'rxjs/operators';

const clicks = fromEvent(document,'click');
const clicksOnDivs = clicks.pipe(
filter(ev=>ev.target.tagName === "DIV")
)

clicksOnDivs.subscribe(x=>console.log(x));

// MouseEvent?{isTrusted: true, screenX: 98, screenY: 207, clientX: 98, clientY: 103,?…}
  • first和last

    first 方法可以接受2个参数,分别是判定函数,没有值得时候,传给下游的值。

    first 没有判定函数的时候, 吐出第一个符合条件的值。

import {fromEvent} from 'rxjs';
import {filter,first} from 'rxjs/operators';

const clicks = fromEvent(document,'click');

const clicksOnDivs = clicks.pipe(
    first(ev=>ev.target.tagName === "DIV")
    // first()
)

clicksOnDivs.subscribe(x=>console.log(x));
  • take 一族操作符

    take就是“拿”,从上游Observable拿数据,拿够了就完结,?于怎么算“拿够”,由take的参数来决定,take只?持?个参数count,也就是限定拿上游Observable的数据数量。

import { interval } from 'rxjs';
import { take } from 'rxjs/operators';

const intervalCount = interval(1000);
const takeFive = intervalCount.pipe(take(5));
takeFive.subscribe(x => console.log(x));
// 0
// 1
// 2
// 3
// 4

take的其他兄弟

  • takeLast : 上游结束之后,从后面开始拿数据。
  • takeWhile : 接受一个判定函数,通过判定函数拿数据。
  • takeUntle :
  • takeUntil
import { fromEvent, interval } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

const source = interval(1000);
const clicks = fromEvent(document, 'click');
const result = source.pipe(takeUntil(clicks));
result.subscribe(x => console.log(x));

// 0 1 2 遇到click就停止。
  • skip: 跳过前面count个数据, 接受一个参数count:number
  • skipWhile 和 skipUntil

    skipWhile 和takeWhile一样接受一个判定函数

import { interval, fromEvent } from 'rxjs';
import { skipUntil } from 'rxjs/operators';

const intervalObservable = interval(1000);
const click = fromEvent(document, 'click');

const emitAfterClick = intervalObservable.pipe(
  skipUntil(click)
);
// clicked at 4.6s. output: 5...6...7...8........ or
// clicked at 7.3s. output: 8...9...10..11.......
const subscribe = emitAfterClick.subscribe(value => console.log(value));

2. 回压控制

所谓的回压控制,可以理解为上游的数据比较多,流入下流的时候,由于太多了,造成了拥堵,为了能够流畅的流到下游,抛弃一些数据。
通过损失掉一些数据让流入和处理的速度平衡。
Rxjs提供了操作符来实现有损的回压控制,就是解决丢弃以及如何丢弃数据。

  • throttle 和 debonuce、audit、sample
  • auditTime 和 audit
  • sampleTime 和 sample

    3. 其他过滤方式

  • ignoreElements
  • elementAt
  • signal

原文地址:https://www.cnblogs.com/coppsing/p/12380978.html

时间: 2024-07-31 09:55:50

RxJS过滤数据流操作符学习 (Filtering Operators)的相关文章

[RxJS] Filtering operators: distinct and distinctUntilChanged

Operator distinct() and its variants are an important type of Filtering operator. This lessons shows how they work and in what cases are they useful. distinctUntilChanged(): var foo = Rx.Observable.interval(500).take(5) .zip(Rx.Observable.of('a','b',

[RxJS] Filtering operators: throttle and throttleTime

Debounce is known to be a rate-limiting operator, but it's not the only one. This lessons introduces you to throttleTime and throttle, which only drop events (without delaying them) to accomplish rate limiting. throttleTime(number): first emits, then

[RxJS] Filtering operators: skipWhile and skipUntil

After takeUntil() and takeWhile() function, let's have a look on skipWhile() and skilUntil() functions. SkipWhile(predicate: function): Skip the value if meet the predicate function. var foo = Rx.Observable.interval(1000); /* --0--1--2--3--4--5--6--7

[Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations)

本章翻译自Elasticsearch官方指南的Filtering Queries and Aggregations一章. 过滤查询以及聚合 A natural extension to aggregation scoping is filtering. Because the aggregation operates in the context of the query scope, any filter applied to the query will also apply to the

转:python 操作符学习

python的操作符大部分和java是相同的,功能相近,运算符等级也差不多,这篇blog就来学习python 操作符: python与java的操作符 python java 描述 or || 逻辑或 and && 逻辑与 not ! 逻辑非 <,>,<=,>=,==,!=或<> <,>,<=,>=,==,!= 比较操作 is,is not instanceof 身份认证 | | 位或 & & 位与 ^ ^ 位异或

C语言操作符学习总结

c语言中关于操作符部分的学习,可以主要分为两个部分:操作符和表达式. 这里首先是列举各种操作符,在C语言中,一般主要的操作符有这么几种:算数操作符,移位操作符,位操作符,赋值操作符,单目运算符,关系操作符,逻辑操作符,条件操作符,逗号表达式以及比较特殊的几个操作符. 算数操作符 算数操作符,主要是:+ , -,  *,  /, % 这些都是比较常见的,不光是在C语言中学习到,事实上从小我们学习数学都常用到他们,所以这里没什么多说的,就是有几点注意事项: 除了取模运算,也就是取余数的%操作符,其他

c++中的placement new操作符学习

参考文献:http://blog.csdn.net/zhangxinrun/article/details/5940019 new操作符: 例子如下:int * pint=new int(23):它先在堆上分配内存空间:接着初始化这个内存空间:最后返回此指针. 对于此操作是可以重载的,记住是只能在类中被重载,得到了一个重载版本为placement new (旧版本是operator new),原型如下void *operator new( size_t, void *p ) throw()  {

创建过滤扩展方法 Creating Filtering Extension Methods 精通ASP-NET-MVC-5-弗瑞曼 Listing 4-17

LINQ Operators之过滤(Filtering)

转:http://www.cnblogs.com/lifepoem/archive/2011/11/16/2250676.html 在本系列博客前面的篇章中,已经对LINQ的作用.C# 3.0为LINQ提供的新特性,还有几种典型的LINQ技术:LINQ to Objects.LINQ to SQL.Entity Framework进行了比较详细的介绍,至此,我们应该了解了各种LINQ技术之间的联系和区别.千里之行始于足下,这些基础理论是理解和使用LINQ 的关键.但是我们在前面的文章中对于LIN