take()自动取消订阅,可以终止Observable和Observe之间的订阅关系。

一、Observable的性质

三种状态:nex, error, complete

进入到Error状态:

const interval$ = Rx.Observable.interval()
.filter(val=>{
throw '出错了'
})
.take()
.reduce((x,y)=>{//reduce接收函数作为参数
return [...x,y];
},[]) interval$.subscribe(
val=>console.log(val),
err=>console.error('Error:' + err),
()=>console.log('I am complete')
);

二、特殊类型的Observable

  • 永不结束
  • Never
  • Empty
  • Throw

永不结束:没有complete状态,比如计时器,每隔1s发射item。

Never:完全不发射item,也不结束。【测试时帮助构成条件】

const interval$ = Rx.Observable.never();
//不会emit任何元素,也不会结束 interval$.subscribe(
val=>console.log(val),
err=>console.error('Error:' + err),
()=>console.log('I am complete')
);

Empty:流里没有元素,直接进入Complete状态。

const interval$ = Rx.Observable.empty(); //不会输出任何元素,直接结束

interval$.subscribe(
val=>console.log(val),
err=>console.error('Error:' + err),
()=>console.log('I am complete')
);

Throw:不发生任何东西,直接进入Error状态。

const interval$ = Rx.Observable.throw('出错了');

interval$.subscribe(
val=>console.log(val),
err=>console.error('Error:' + err),
()=>console.log('I am complete')
);

三、工具类操作符do

一般用来做调试。

或者外部条件的设置。

流进入到下一步之前需要对外部的东西进行改变【写文件之类】

const interval$ = Rx.Observable.interval()
.map(val=>val*)
.do(v=>console.log('val is' +v)) //在map之后,take之前,在流发生之前看一下流里有什么东西
.take();
interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

do很像临时subscribe,但是没有把流中断掉。可以继续应用操作符。临时中间桥梁,打印值做调试。

let logLabel='当前值是';

const interval$ = Rx.Observable.interval()
.map(val=>val*)
.do(v=>{
console.log(logLabel +v); //取得了外部的值
logLabel='当前'; //改变了外部的值
})
.take(); interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

四、变换类操作符:scan

scan:

场景:记住之前的运算结果。每次运算都会发射值。

scan接收函数作为参数,x是增加器,默认初始值0,把函数返回的结果作为下次的x。

const interval$ = Rx.Observable.interval()
.filter(val=>val%===)
.scan((x,y)=>{//scan接收函数作为参数
return x+y;
})
.take() interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

五、数学类操作符reduce

数组中也有,使用比较频繁。

和scan对比,reduce只会发射一个最终值。

.filter(val=>val%===)
.take()
.reduce((x,y)=>{//reduce接收函数作为参数,只会发射一个最后的值
return x+y;
}) interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

高级用法:

const interval$ = Rx.Observable.interval()
.filter(val=>val%===)
.take()
.reduce((x,y)=>{//reduce接收函数作为参数
return [...x,y]; //每次数组加y
},[]) //x初始值为空数组[] interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

六、过滤类操作符 filter,take,first/last,skip...

总共100多种operator。

filter:

let logLabel='当前值是';

const interval$ = Rx.Observable.interval()
.filter(val=>val%===) //过滤偶数
.do(v=>{console.log(logLabel +v);
logLabel='当前';}
)
.take(); interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

first:

const interval$ = Rx.Observable.interval()
.filter(val=>val%===)
.first() //和take(1)是一样的,取第一个
// .take(1) interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

skip: 和take相反

const interval$ = Rx.Observable.interval()
.filter(val=>val%===)
.skip(); //过滤掉0和2 interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
); 

用skip和take就能做到分页的效果。

七、常见创建类操作符:Interval,Timer

1、interval

const interval$ = Rx.Observable.interval();
interval$.subscribe(val=>console.log(val));

通过take取前3个来看三种状态的效果

const interval$ = Rx.Observable.interval().take();
interval$.subscribe(
val=>console.log(val),
err=>console.log(err),
()=>console.log('I am complete')
);

2、Timer

const timer$= Rx.Observable.timer();

timer$.subscribe(v=>console.log(v));
//控制台只输出一个值0

第一个参数:delay多长时间

第二个参数:之后要以什么频率发送

const timer$= Rx.Observable.timer(,);
timer$.subscribe(v=>console.log(v));
//类似interval,但是interval不能指定开始延迟时间

实践:给Observable增加一个debug操作符

只有在生产环境才输出

import {Observable} from 'rxjs/Observable';
import {environment} from '../../environments/environment'; declare module 'rxjs/Observable' {
interface Observable<T> {
debug: (...any) => Observable<T>;
}
} Observable.prototype.debug = function(message: string) {
return this.do(
(next) => {
if (!environment.production) {
console.log(message, next);
}
},
(err) => {
if (!environment.production) {
console.error('ERROR>>>', message, err);
}
},
() => {
if (!environment.production) {
console.log('Completed - ');
}
}
);
};

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:https://www.cnblogs.com/starof/p/9137865.html 有问题欢迎与我讨论,共同进步。

RxJS操作符(二)的更多相关文章

  1. RxJS操作符(三)

    一.过滤类操作符:debounce, debounceTime 跟时间相关的过滤 debounceTime自动完成:性能,避免每次请求都往出发 ); debounce中间传入Observable co ...

  2. RxJS操作符(一)

    一.创建类操作符 创建类操作符是连接传统编程和响应式编程的强梁 from: 可以把数组.Promise.以及Iterable转化为Observable. fromEvent: 可以把事件转化为Obse ...

  3. Rxjs 操作符

    1. javascript解决异步编程方案 解决javascript异步编程方案有两种,一种是promise对象形式,还有一种是是Rxjs库形式,Rxjs相对于Promise来说,有好多Promise ...

  4. 《JavaScript高级程序设计》读书笔记 ---操作符二

    关系操作符 小于(<).大于(>).小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比较,比较的规则与我们在数学课上所学的一样.这几个操作符都返回一个布尔值, ...

  5. LINQ操作符二:SelectMany

    SelectMany操作符提供了将多个from子句组合起来的功能,相当于数据库中的多表连接查询,它将每个对象的结果合并成单个序列. 示例: student类: using System; using ...

  6. JAVA编程思想(2) - 操作符(二)

    5. 直接常量 -一般来说,假设程序里使用了"直接常量",编译器能够准确的知道要生成什么样的类型.但有时候却是模棱两可的. 这时候须要我们对编译器进行适当的"指导&quo ...

  7. rxjs入门7之其它操作符复习

    一.辅助类操作符 二.过滤数据流 三.转化数据流 四.异常错误处理 五.多播 ,Subject类型

  8. RxJS中高阶操作符的全面讲解:switchMap,mergeMap,concatMap,exhaustMap

    RxJS中高阶映射操作符的全面讲解:switchMap, mergeMap, concatMap (and exhaustMap) 原文链接:https://blog.angular-universi ...

  9. RxJS v6 学习指南

    为什么要使用 RxJS RxJS 是一套处理异步编程的 API,那么我将从异步讲起. 前端编程中的异步有:事件(event).AJAX.动画(animation).定时器(timer). 异步常见的问 ...

随机推荐

  1. Python——Microsoft Office编程

    一.Excel 需要安装xlrd和xlwt这两个库   1.打开excel readbook = xlrd.open_workbook(r'\test\canying.xlsx') 2.获取读入的文件 ...

  2. java extends和implements区别

    一.作用说明 extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 二.补充 JAVA ...

  3. [ZJOI2019]麻将(动态规划,自动机)

    [ZJOI2019]麻将(动态规划,自动机) 题面 洛谷 题解 先做一点小铺垫,对于一堆牌而言,我们只需要知道这\(n\)张牌分别出现的次数就行了,即我们只需要知道一个长度为\(n\)的串就可以了. ...

  4. '{}/{}_frames_{:02d}.npy'.format(dataset, train_or_test, i+1)函数

    在阅读有关代码的时候,发现一段代码写为: data_frames = np.load(os.path.join(video_root_path, '{}/{}_frames_{:02d}.npy'.f ...

  5. django系列7:修改404页面展示,优化模板,降低urlconf和模板之间的耦合,命名app将模板和app绑定

    为了增加程序的友好和健壮性,修改view代码,处理以下如果出现404,页面的UI展示. 修改view代码 from django.http import Http404 from django.sho ...

  6. (二叉树 BFS) leetcode102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  7. EXCEL(1)级联下拉框

    EXCEL级联下拉框 http://jingyan.baidu.com/article/3c343ff756e0cf0d377963f9.html 在输入一些多级项目时,如果输入前一级内容后,能够自动 ...

  8. python httpserver

    python3: python -m http.server 80 python2: python -m SimpleHTTPServer 9004

  9. Nginx常用的平滑重启

    之前在做运维工作中,经常需要添加虚拟主机,或者添加修改配置文件,但是测试环境还好,随便玩,如果是生产环境的话,既要保证配置不出问题,有不能中断服务.如果是这样的话,就需要对配置文件进行语法检测以及平滑 ...

  10. SQLALlchemy数据查询小集合

    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作.将对象转换成SQL,然后使用数据API执行SQL并获取执行结果.在写项目的过 ...