rxjs入门5之创建数据流
一 创建同步数据流
1.creat
Observable.create = function (subscribe) {
return new Observable(subscribe);
};
2.of:列举数据
of(1,2,3).pipe(filter(curr=>curr>=2)).subscribe(console.log);
//2
//3
3.range:指定范围
range(1,100).pipe(map(value=>value)).subscribe(console.log); //从1到100的所有正整数
//1
//2
//...
//3
4.generate:循环创建
generate类似⼀个for循环,设定⼀个初始值,每次递增这个值,直到满⾜某个条件的时候才中⽌循环,同时,循环体内可以根据当前值产⽣数据。⽐如,想要产⽣⼀个⽐10⼩的所有偶数的平⽅。
const source$ = Observable.generate(
2, // 初始值,相当于for循环中的i=2
value => value < 10, //继续的条件,相当于for中的条件判断
value => value + 2, //每次值的递增
value => value * value // 产⽣的结果
);
三个极简的操作符:empty、never 和 throw
1.empty:empty就是产⽣⼀个直接完结的Observable对象,没有参数,不产⽣任何数据,直接完结,下⾯是⽰例代码:
const source$ = Observable.empty();
2.never:never产⽣的
Observable对象就真的是什么都不做,既不吐出数据,也不完结,也不产⽣错误,就这样待着,⼀直到永远。
const source$ = Observable.never();
3.throwError:throwError产⽣的Observable对象也是什么都不做,直接出错,抛出的错误就是throw的参数,下⾯是使⽤throw的⽰例代码:
const source$ = Observable.throwError(new Error('Oops'));
never、empty和throw单独使⽤没有意义,但是,在组合Observable对象时,如果需要这些特殊的Observable对象,这三个操作符可以直接使⽤,例如,根据条件是否产⽣出错的数据流如
const source$ = Observable.never();
$source.concat(shouldEndWell? Observable.empty() : Observable.throw(new Error()));
创建异步数据流
1.interval 和 timer
interval:interval接受⼀个数值类型的参数,代表产⽣数据的间隔毫秒数,返回的Observable对象就按照这个时间间隔输出递增的整数序列。
interval(1000).pipe(take(10),map(value=>value + 1)).subscribe(console.log); //每隔1s返回 从2开始依次递增,take(10)代表取10个数据值,到输出10 结束
timer :timer(2000,1000)还⽀持第⼆个参数,如果使⽤第⼆个参数,那就会产⽣⼀个持续吐出数据的Observable对象,类似interval的数据流。第⼆个参数指定的是各数据之间的时间间隔,从被订阅到产⽣第⼀个数据0的时间间隔,依然由第⼀个参数决定
const source$ = Observable.timer(2000, 1000);//source$被订阅之后,2秒钟的时刻吐出0,然后3秒钟的时刻吐出1,4秒钟的时刻吐出2……依次类推:
2.from :可以把一切转化为Observable
from可能是创建类操作符中包容性最强的⼀个了,因为它接受的参数只要“像”Observable就⾏,然后根据参数中的数据产⽣⼀个真正的Observable对象。
比如:数组,类数组,字符串,⼀个JavaScript中的generator也很像Observable,Promise 对象...
function * generateNumber(max) {
for (let i=1; i<=max; ++i) {
yield i;
}
}
const source$ = Observable.from(generateNumber(3));
const promise = Promise.resolve('good');
from(promise).subscribe(
console.log,
error => console.log('catch', error),
() => console.log('complete')
);
//结果:
//good
//complete
Promise对象虽然也⽀持异步操作,但是它只有⼀个结果,所以当Promise成功完成的时候,from也知道不会再有新的数据了,所以⽴刻完结了产⽣的Observable对象。当Promise对象以失败⽽告终的时候,from产⽣的Observable对象也会⽴刻产⽣失败事件
3.fromEvent
如果从事⽹页开发,fromEvent是最可能会被⽤到的操作符,因为⽹页应⽤总是要获取⽤户在⽹页中的操作事件,⽽fromEvent最常见的⽤法就是把DOM中的事件转化为Observable对象中的数据.fromEvent的第⼀个参数是⼀个事件源,在浏览器中,最常见的事件源
就是特定的DOM元素,第⼆个参数是事件的名称,对应DOM事件就是click、mousemove这样的字符串.
<div>
<button id="clickMe">Click Me</button>
<div id="text">0</div>
</div>
let clickCount = 0;
fromEvent(document.querySelector('#clickMe'), 'click').subscribe(
() => {
document.querySelector('#text').innerText = ++clickCount
}
);
4.ajax
详情请见 ajax在项目中的封装
defer
在创建之时并不会做分配资源的⼯作,只有当被订阅的时候,才会去创建真正占⽤资源的Observable,之前产⽣的代理Observable会把所有⼯作都转交给真正占⽤资源的Observable。这种推迟占⽤资源的⽅法是⼀个惯⽤的模式,在RxJS中,defer这个操作符实现的就是这种模式。
const observableFactory = () => Observable.of(1, 2, 3);
const source$ = Observable.defer(observableFactory);
const observableFactory = () => Observable.ajax(ajaxUrl);
const source$ = Observable.defer(observableFactory);
rxjs入门5之创建数据流的更多相关文章
- rxjs入门6之合并数据流
一 concat,merge,zip,combineLatest等合并类操作符 以上操作符在版本6中已经只存在静态方法,不能在pipe中使用. import {concat,merge,zip,com ...
- RxJS 入门指引和初步应用
作者:徐飞链接:https://zhuanlan.zhihu.com/p/25383159来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. RxJS是一个强大的React ...
- Rxjs入门实践-各种排序算法排序过程的可视化展示
Rxjs入门实践-各种排序算法排序过程的可视化展示 这几天学习下<算法>的排序章节,具体见对排序的总结,想着做点东西,能将各种排序算法的排序过程使用Rxjs通过可视化的方式展示出来,正好练 ...
- SharePoint 2013 入门教程之创建页面布局及页面
在SharePoint的使用过程中,页面布局和页面时很重要的两个概念,主要用于数据个性化展示,下面,我们简单介绍一下SharePoint的页面布局和页面的个性化. 一. SharePoint页面模型概 ...
- IOS 入门开发之创建标题栏UINavigationBar的使用(二)
IOS 入门开发之创建标题栏UINavigationBar的使用 http://xys289187120.blog.51cto.com/3361352/685746 IOS 开发有关界面的东西 ...
- 【SSRS】入门篇(一) -- 创建SSRS项目
原文:[SSRS]入门篇(一) -- 创建SSRS项目 在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目. 报表服务器项目用于创建在报表服务器中 ...
- ReactiveX 学习笔记(2)创建数据流
操作符(Operators) Rx 的操作符能够操作(创建/转换/组合) Observable. Creating Observables 本文主题为创建/生成 Observable 的操作符. 这里 ...
- IOS 入门开发之创建标题栏UINavigationBar的使用
转自:http://xys289187120.blog.51cto.com/3361352/685746 IOS 入门开发之创建标题栏UINavigationBar的使用 IOS 开发有关界面 ...
- Spring入门案例 idea创建Spring项目
spring入门案例 idea创建spring项目 Spring介绍 Spring概述 Spring是一个开源框架,Spring是2003年兴起的轻量级java开发框架,由Rod Johnson 在其 ...
随机推荐
- 【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!
写在前面 相信大部分小伙伴在面试过程中,只会针对面试官提出的表面问题来进行回答.其实不然,面试官问的每一个问题都是经过深思熟虑的,面试的时间相对来说也是短暂的,面试官不可能在很短的时间内就对你非常了解 ...
- jinja2快速实现自定义的robotframework的测试报告
一.背景 RF的结果报告可以方便我们查看每一条用例集.用例的执行结果统计,但是有的项目涉及到一些数据的比对,希望能够直观到看到数据,原生的测试报告就无法满足这个需求了. 原生的报告 项目需求报告格式 ...
- Linux 用户与权限
这些天一直在看Linux的命令但是却没有写文章,因为感觉没有必要,哪些简单的命令,vi cat cd 啥的,是个做开发的就知道,所以就没写; 用户管理 第一个我们知道的用户就是Root 没错哦,这就是 ...
- 20190923-02Linux文件目录类 000 010
pwd 显示当前工作目录的绝对路径 pwd:print working directory 打印工作目录 1.基本语法 pwd (功能描述:显示当前工作目录的绝对路径) 2.案例实操 (1)显示当前工 ...
- 莫名其妙的Explain Plan
两张表的建表语句: CREATE TABLE hy_emp ( empno NUMBER(8,0) not null primary key, ename NVARCHAR2(60) not null ...
- CDH5.16.1集群企业真正离线部署
一.准备工作 1.离线部署主要分为三块: MySQL离线部署 CM离线部署 Parcel文件离线源部署 2.规划 节点 MySQL部署组件 Parcel文件离线源 CM服务进程 大数据组件 hadoo ...
- linux下设置账户锁定阈值:登录失败n次,多长时间后解锁重新登录
在centos系统下: 1.执行命令 vim /etc/pam.d/system-auth或vim /etc/pam.d/ login 2.执行命令 vim /etc/pam.d/sshd 3.在上面 ...
- 吴恩达《深度学习》-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-第一周 机器学习(ML)策略(1)(ML strategy(1))-课程笔记
第一周 机器学习(ML)策略(1)(ML strategy(1)) 1.1 为什么是 ML 策略?(Why ML Strategy?) 希望在这门课程中,可以教给一些策略,一些分析机器学习问题的方法, ...
- [Java核心技术]第九章-集合(Java集合框架、具体的集合、映射)
9.1Java集合框架 一些有的没的 可以使用接口类型存放集合的引用.一旦改变了想法,只需要在调用构造函数的地方做一处修改. add方法用于向集合添加元素,如果添加元素确实改变了集合就返回true. ...
- python中的运动控制函数
运动控制函数:控制海龟走直线&走曲线 海龟向前行进,海龟走直线,参数d表示行进距离,也可以为负数,单位是像素 根据半径r绘制extent角度的弧形 r : 默认圆心在海龟左侧r 距离的位置 e ...