RxJS操作符(二)
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操作符(二)的更多相关文章
- RxJS操作符(三)
一.过滤类操作符:debounce, debounceTime 跟时间相关的过滤 debounceTime自动完成:性能,避免每次请求都往出发 ); debounce中间传入Observable co ...
- RxJS操作符(一)
一.创建类操作符 创建类操作符是连接传统编程和响应式编程的强梁 from: 可以把数组.Promise.以及Iterable转化为Observable. fromEvent: 可以把事件转化为Obse ...
- Rxjs 操作符
1. javascript解决异步编程方案 解决javascript异步编程方案有两种,一种是promise对象形式,还有一种是是Rxjs库形式,Rxjs相对于Promise来说,有好多Promise ...
- 《JavaScript高级程序设计》读书笔记 ---操作符二
关系操作符 小于(<).大于(>).小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比较,比较的规则与我们在数学课上所学的一样.这几个操作符都返回一个布尔值, ...
- LINQ操作符二:SelectMany
SelectMany操作符提供了将多个from子句组合起来的功能,相当于数据库中的多表连接查询,它将每个对象的结果合并成单个序列. 示例: student类: using System; using ...
- JAVA编程思想(2) - 操作符(二)
5. 直接常量 -一般来说,假设程序里使用了"直接常量",编译器能够准确的知道要生成什么样的类型.但有时候却是模棱两可的. 这时候须要我们对编译器进行适当的"指导&quo ...
- rxjs入门7之其它操作符复习
一.辅助类操作符 二.过滤数据流 三.转化数据流 四.异常错误处理 五.多播 ,Subject类型
- RxJS中高阶操作符的全面讲解:switchMap,mergeMap,concatMap,exhaustMap
RxJS中高阶映射操作符的全面讲解:switchMap, mergeMap, concatMap (and exhaustMap) 原文链接:https://blog.angular-universi ...
- RxJS v6 学习指南
为什么要使用 RxJS RxJS 是一套处理异步编程的 API,那么我将从异步讲起. 前端编程中的异步有:事件(event).AJAX.动画(animation).定时器(timer). 异步常见的问 ...
随机推荐
- Python——Microsoft Office编程
一.Excel 需要安装xlrd和xlwt这两个库 1.打开excel readbook = xlrd.open_workbook(r'\test\canying.xlsx') 2.获取读入的文件 ...
- java extends和implements区别
一.作用说明 extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 二.补充 JAVA ...
- [ZJOI2019]麻将(动态规划,自动机)
[ZJOI2019]麻将(动态规划,自动机) 题面 洛谷 题解 先做一点小铺垫,对于一堆牌而言,我们只需要知道这\(n\)张牌分别出现的次数就行了,即我们只需要知道一个长度为\(n\)的串就可以了. ...
- '{}/{}_frames_{:02d}.npy'.format(dataset, train_or_test, i+1)函数
在阅读有关代码的时候,发现一段代码写为: data_frames = np.load(os.path.join(video_root_path, '{}/{}_frames_{:02d}.npy'.f ...
- django系列7:修改404页面展示,优化模板,降低urlconf和模板之间的耦合,命名app将模板和app绑定
为了增加程序的友好和健壮性,修改view代码,处理以下如果出现404,页面的UI展示. 修改view代码 from django.http import Http404 from django.sho ...
- (二叉树 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, ...
- EXCEL(1)级联下拉框
EXCEL级联下拉框 http://jingyan.baidu.com/article/3c343ff756e0cf0d377963f9.html 在输入一些多级项目时,如果输入前一级内容后,能够自动 ...
- python httpserver
python3: python -m http.server 80 python2: python -m SimpleHTTPServer 9004
- Nginx常用的平滑重启
之前在做运维工作中,经常需要添加虚拟主机,或者添加修改配置文件,但是测试环境还好,随便玩,如果是生产环境的话,既要保证配置不出问题,有不能中断服务.如果是这样的话,就需要对配置文件进行语法检测以及平滑 ...
- SQLALlchemy数据查询小集合
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作.将对象转换成SQL,然后使用数据API执行SQL并获取执行结果.在写项目的过 ...