java中expand用法_Rxjs expand的用法分析
Rxjs的expand()函数声明:public expand(project: function(value: T, index: number), concurrent: number, scheduler: Scheduler): Observable
expand()会递归调用project函数,project函数把源值映射为一个Observable,每次递归调用都是把前一次调用输出的Observable的源作为输入。最后把所有的Observable合并为一个Observable作为结果输出。
它接收三个参数:project:映射函数,以前一次调用输出额Observable作为输入,返回一个新的Observable。
concurrent:最大并发次数,默认值为Number.POSITIVE_INFINITY,即无限次递归调用
scheduler:默认为null,表示立即执行
单个源值
示例:const source = Rx.Observable.of(1);
const powerTow = source
// 递归调用提供的函数
.expand(val => {
console.log(`输入: ${val}`);
return Rx.Observable.of(2*val);
})
.take(5);
const subscribe = powerTow.subscribe(val => console.log(`输出: ${val}`));
示例输出源值1,每次对源值乘以2。take(5)限定了只输出前5个Observable,包括初始的源值1。
结果为:"输出: 1"
"输入: 1"
"输出: 2"
"输入: 2"
"输出: 4"
"输入: 4"
"输出: 8"
"输入: 8"
"输出: 16"
"输入: 16"
多源值
单个源值是比较容易理解,递归调用project函数是顺序的。当源值产生是异步且是多个的,每一个源值都会单独递归调用project映射函数。最后把所有产生的Observable合并为一个Observable作为结果。
示例:var clicks = Rx.Observable.fromEvent(document, 'click');
var powersOfTwo = clicks
.map(e => 1)
.expand(x => {
console.log(`输入:${x}`);
return Rx.Observable.of(2 * x).delay(1000)})
.take(5);
powersOfTwo.subscribe(x => console.log(`输出:${x}`));
示例监听页面的点击事件,每次点击发送源值1,并对源值执行expand,expand的映射函数也是将源值乘以2,并延时1000毫秒。
点击一次,输出结果是和上面的例子一样。连续点击两次,输出结果:输出:1
输入:1
输出:1
输入:1
输出:2
输入:2
输出:2
输入:2
输出:4
输入:4
由于例子里做了延时,多次点击的时间不同,输出的结果也是不同的。
递归调用的终止
默认情况下,expand递归调用时不限次数的,那如何终止呢。可以有以下一些可以终止递归调用:
1、使用take()操作符
2、映射函数project,返回一个empty Observablevar source = new Rx.Observable.of(3);
source.expand(function(x) {
console.log('count: ' + x);
x--;
return (x >= 0) ? Rx.Observable.just(x) : Rx.Observable.empty()
})
.subscribe(
function (x) {
console.log('Next: ' , x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
java中expand用法_Rxjs expand的用法分析相关推荐
- JAVA中的break[标签]continue[标签]用法
原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...
- java中Collections.sort() 排序函数的用法
java中Collections.sort() 排序函数的用法: 用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** ...
- 12 java中instanceof运算符的意义和用法
java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...
- java解析xml实例_在java中使用dom解析xml的示例分析
本篇文章介绍了,在java中使用dom解析xml的示例分析.需要的朋友参考下 dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之 ...
- Java 中 Comparable 接口的意义和用法.
在之前的博文中已经介绍了Java中Collection 接口和 Collections类. http://blog.csdn.net/nvd11/article/details/21516075 一, ...
- Java中final关键字的几种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面大家跟随动力节点java ...
- [转载] java中50个关键字以及各自用法大全
参考链接: Java中的默认数组值 关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意 ...
- final关键字_夯实基础:Java中final关键字的几种用法
导语 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构. 关于static请查 ...
- Java中this关键字和super关键字用法
构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过 ...
- java中50个关键字以及各自用法大全
关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表 ...
最新文章
- anydesk截屏技术
- spring入门-----spring中遍历各种集合
- meetup_使用RxNetty访问Meetup的流API
- 我的python学习笔记全集_记录我的Python学习笔记
- 控件事件的发生与页面加载的关系
- 回忆Java基础中Map的遍历方法
- C++基础::函数、类、类型所在的头文件 接口的介绍
- ISIS协议的有关认识
- 2021年3月CISSP考试顺利通过,超详细的经验介绍
- English语法_形容词-排序
- ubuntu无法打开图片
- 电影特效是计算机专业吗,像那种专门为电影做特效的电脑最起码要达到什么样的配置呢?...
- Android批量打包-如何一秒内打几十个apk渠道包
- 10、私网与公网的转换---NAT网络地址转换技术
- DOS命令:assoc
- 论文阅读:《AliMe Assist: An Intelligent Assistant for Creating an Innovative E-commerce Experience》
- Thrust 入门常用 网址 - Thrust Example
- php 读取文件大小限制,PHP fread():读取文件(任意长度)
- 360扣扣保镖 QQ 360 打架
- Halcon解决方案指南(16)一维码识别