Rxjs 操作符
1. javascript解决异步编程方案
解决javascript异步编程方案有两种,一种是promise对象形式,还有一种是是Rxjs库形式,Rxjs相对于Promise来说,有好多Promise没有的特性和功能,使用起来更便捷简单;
2. Rxjs 简单介绍
Rxjs 是Reactive Extensions JavaScript 的简写,响应式异步编程;同Promise对象一样,是解决JS异步编程的一种解决方案;
3. Rxjs使用
1. Rxjs是一个库,需要使用npm进行安装;
// 安装rxjs
npm install rxjs --save
// 安装rxjs-compat, rxjs-compat软件包在v5和v6之间创建了一个api兼容层
npm install rxjs-compat --save
2. Rxjs常用操作符
2-1. 创建操作符: fromEvent、 from、 of、 interval、 create
(1). fromEvent: 创建一个 Observable,该 Observable 发出来自给定事件对象的指定类型事件
// 获取html元素
const btnElem = document.querySelector('button#rxjsBtn');
// 创建按钮的点击事件为可观察对象
Rx.Observable.fromEvent(btnElem, 'click')
.scan(count => count + 1, 0) // count为定义的变量;逗号后面的0为count的初始值;箭头后面的语句值为scan返回的值;
.subscribe((count) => {
console.log('fromEvent' + count);
});
/// 第一次点击输出: fromEvent1;第二次点击输出fromEvent2;依次同理
(2). from: 将各种其他对象和数据类型转化为 Observables
const arrayData = [5, 6];
Observable.from(arrayData).pipe(
scan((scanData, item) => scanData += item, 10),
map((item) => item * 2),
).subscribe((data: any) => {
console.log('from:' + data);
});
/// 浏览器输出 from:30 from:42
(3). of: 创建一个 Observable,它会依次发出由你提供的参数,最后发出完成通知。
Observable.of('value1', 'value2')
.subscribe((data: any) => {
console.log('of:' + data);
});
/// 浏览器输出 of:value1 of: value2
(4). interval: 返回一个无线自增的序列整数
const numbers = Rx.Observable.interval(1000);
numbers.subscribe(x => console.log('interval:'+x));
/// 浏览器输出: interval:1 interval2 依次增加
(5). create: 创建Observable对象, 当观察者( Observer )订阅该 Observable 时,它会执行指定的函数
const obs = Observable.create((obsever) => {
obsever.next('add');
obsever.next('upt');
obsever.complete(); // 代表完成,之后的语句将不再会被调用;;;
obsever.next('del');
});
// 订阅观察者
obs.map(data => data + 'Map').subscribe((data: any) => {
console.log(data);
});
/// 浏览器输出: addMap uptMap
2-2. 转换操作符 : Map、MergeMap、MapTo、Scan
(1). Map: 把每个源值传递给转化函数以获得相应的输出值
Rx.Observable.from([1, 2])
.map((item) => item * 2)
.subscribe((data: any) => { console.log('map:' + data);});
/// 浏览器输出: map: 2 map: 4
(2). MergeMap: 将每个源值投射成 Observable ,该 Observable 会合并到输出 Observable 中;;;;可用于串联请求
const mergeA = Observable.of(1, 2, 3);
const mergeB = mergeA.map(r => Observable.of(r)).mergeMap(r => r);
mergeB.subscribe(c => console.log('mergeMap:' + c));
/// 浏览器输出: mergeMap1 mergeMap2 mergeMap3
(3). MapTo: 类似于 map,但它每一次都把源值映射成同一个输出值。
Observable.of(1, 2, 3).mapTo(33).subscribe(data => {console.log(data);});
/// 浏览器输出: 3个55
(4). Scan: 对源 Observable 使用累加器函数, 返回生成的中间值, 可选的初始值
Rx.Observable.from([1, 2]).pipe(
scan((acc, item) => acc += item, 10)) // acc为一个新变量,item为[1,2]中的每一项, 10为新变量acc的默认初始值;返回新生成的中间值acc reduce同理
.subscribe(v => console.log(v))
/// 浏览器输出 11 13
2-3. 数学和聚合操作符:reduce
(1). reduce: 和scan同理;只不过中间变量的值不会清0,会保留上一次源操作之后的得到的中间值;并且只会输出最后一个值;
Rx.Observable.from([1, 2]).pipe(
reduce((acc, item) => acc += item, 10))
.subscribe(v => console.log(v))
// 输出
13
2-4. 过滤操作符: filter、throttleTime
(1). filter: 数据进行过滤返回你想要的数据
import {Observable} from 'rxjs';
import {filter} from 'rxjs/internal/operators';
from([2, 3, 4]).pipe(
filter(item => item <= 3))
.subscribe(v => console.log(v))
// 浏览器输出: 2 3
(2). throttleTime: 在一定时间范围内不管产生了多少事件,它只放第一个过去,剩下的都将舍弃
####### 实现: 一秒内不管有多少点击事件;只触发一次点击事件;,
const throttleElem = document.querySelector('#throttleElem');
// 一秒内只触发一次点击事件
Rx.Observable.fromEvent(throttleElem, 'click')
.throttleTime(1000)
.scan(count => count + 1, 0)
.subscribe(data => {
console.log('点击了' + data + '次');
});
Rxjs 操作符的更多相关文章
- RxJS操作符(三)
一.过滤类操作符:debounce, debounceTime 跟时间相关的过滤 debounceTime自动完成:性能,避免每次请求都往出发 ); debounce中间传入Observable co ...
- RxJS操作符(二)
一.Observable的性质 三种状态:nex, error, complete 进入到Error状态: ) .filter(val=>{ throw '出错了' }) .take() .re ...
- RxJS操作符(一)
一.创建类操作符 创建类操作符是连接传统编程和响应式编程的强梁 from: 可以把数组.Promise.以及Iterable转化为Observable. fromEvent: 可以把事件转化为Obse ...
- RxJS中高阶操作符的全面讲解:switchMap,mergeMap,concatMap,exhaustMap
RxJS中高阶映射操作符的全面讲解:switchMap, mergeMap, concatMap (and exhaustMap) 原文链接:https://blog.angular-universi ...
- RxJS v6 学习指南
为什么要使用 RxJS RxJS 是一套处理异步编程的 API,那么我将从异步讲起. 前端编程中的异步有:事件(event).AJAX.动画(animation).定时器(timer). 异步常见的问 ...
- RxJS入门
一.RxJS是什么? 官方文档使用了一句话总结RxJS: Think of RxJS as Lodash for events.那么Lodash主要解决了什么问题?Lodash主要集成了一系列关于数组 ...
- 【LINQ标准查询操作符总结】之聚合操符
C# 中的LINQ 提供了两种操作方式,查询表达式和查询操作符,所有的查询表达式都有对应的查操作符类替代,查询表达式有点“类” SQL,在代码中写SQL,总觉得不够“优雅”,使用查询操作符就显得“优 ...
- [译]Rxjs&Angular-退订可观察对象的n中方式
原文/出处: RxJS & Angular - Unsubscribe Like a Pro 在angular项目中我们不可避免的要使用RxJS可观察对象(Observables)来进行订阅( ...
- Angular 4+ Http
HTTP: 使应用能够对远端服务器发起相应的Http调用: 你要知道: HttpModule并不是Angular的核心模块,它是Angualr用来进行Web访问的一种可选方式,并位于一个名叫@angu ...
随机推荐
- 如何理解JS中this指向的问题
首先,用一句话解释this,就是:指向执行当前函数的对象. 当前执行,理解一下,也就是说this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定.this到底指向谁?this的最终指向的 ...
- .NET CORE下最快比较两个文件内容是否相同的方法 - 续
.NET CORE下最快比较两个文件内容是否相同的方法 - 续 在上一篇博文中, 我使用了几种方法试图找到哪个是.NET CORE下最快比较两个文件的方法.文章发布后,引起了很多博友的讨论, 在此我对 ...
- Elasticsearch和solr之我为什么选择solr
老大:这个项目需要用到搜索引擎,小李你去学习一下. 小李:喳! 小李:以前用过的搜索引擎是solr4.7,那已经是两年前使用的了不知道现在有没有更好的解决方案了呢? 小李打开了google,百度,bi ...
- 【selenium】- webdriver常见元素定位(中)
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1.By.tagName 遇到hidden就break,继续下一个循环. 2.By.linkText 对上图中的“糯米”进行定位: 3.By. ...
- P2467 [SDOI2010]地精部落 DP
传送门:https://www.luogu.org/problemnew/show/P2467 参考与学习:https://www.luogu.org/blog/user55639/solution- ...
- Ubuntu 18.04 安装 onedrive
问题 在Ubuntu 18.04上安装Onedrive 问题背景 对于文档的同步,还是喜欢用Onedrive,主要因为Onedrive对文档的在线编辑支持很好. Onedrive初始免费容量5G,加上 ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- JSQL查询
JSQL 其特征与原生soL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性. sql:查询的是表和表中的字段 jpql:查询的是实体类和类中的属性 查询全部 >> ...
- odoo12从零开始:三、1)创建你的第一个应用模型(module)
前言 以前,我一直都不知道为什么好多框架的入门都是“hello world”开始,当我思前想后我要如何介绍odoo的model.record.template等继承等高级特性时,发现在那之前便需要清楚 ...
- 如何将 JavaScript 代码添加到网页中,以及 <script> 标签的属性
Hello, world! 本教程的这一部分内容是关于 JavaScript 语言本身的. 但是,我们需要一个工作环境来运行我们的脚本,由于本教程是在线的,所以浏览器是一个不错的选择.我们会尽可能少地 ...