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的用法分析相关推荐

  1. JAVA中的break[标签]continue[标签]用法

    原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...

  2. java中Collections.sort() 排序函数的用法

    java中Collections.sort() 排序函数的用法: 用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** ...

  3. 12 java中instanceof运算符的意义和用法

    java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...

  4. java解析xml实例_在java中使用dom解析xml的示例分析

    本篇文章介绍了,在java中使用dom解析xml的示例分析.需要的朋友参考下 dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之 ...

  5. Java 中 Comparable 接口的意义和用法.

    在之前的博文中已经介绍了Java中Collection 接口和 Collections类. http://blog.csdn.net/nvd11/article/details/21516075 一, ...

  6. Java中final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面大家跟随动力节点java ...

  7. [转载] java中50个关键字以及各自用法大全

    参考链接: Java中的默认数组值 关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意 ...

  8. final关键字_夯实基础:Java中final关键字的几种用法

    导语 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构. 关于static请查 ...

  9. Java中this关键字和super关键字用法

    构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过 ...

  10. java中50个关键字以及各自用法大全

    关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表 ...

最新文章

  1. anydesk截屏技术
  2. spring入门-----spring中遍历各种集合
  3. meetup_使用RxNetty访问Meetup的流API
  4. 我的python学习笔记全集_记录我的Python学习笔记
  5. 控件事件的发生与页面加载的关系
  6. 回忆Java基础中Map的遍历方法
  7. C++基础::函数、类、类型所在的头文件 接口的介绍
  8. ISIS协议的有关认识
  9. 2021年3月CISSP考试顺利通过,超详细的经验介绍
  10. English语法_形容词-排序
  11. ubuntu无法打开图片
  12. 电影特效是计算机专业吗,像那种专门为电影做特效的电脑最起码要达到什么样的配置呢?...
  13. Android批量打包-如何一秒内打几十个apk渠道包
  14. 10、私网与公网的转换---NAT网络地址转换技术
  15. DOS命令:assoc
  16. 论文阅读:《AliMe Assist: An Intelligent Assistant for Creating an Innovative E-commerce Experience》
  17. Thrust 入门常用 网址 - Thrust Example
  18. php 读取文件大小限制,PHP fread():读取文件(任意长度)
  19. 360扣扣保镖 QQ 360 打架
  20. Halcon解决方案指南(16)一维码识别

热门文章

  1. 1996届瑞安市计算机学校,1996届校友
  2. 用计算机探索规律的总结,《用计算器探索规律》(通用6篇)
  3. 关于博主帅soserious的一些感想.
  4. No.050<软考>《(高项)备考大全》【冲刺4】《软考之 119个工具 (2)》
  5. 第6章第23节:文字视觉化:使用图片来诠释文字的涵义 [PowerPoint精美幻灯片实战教程]
  6. JD旗舰店店铺商品详情接口代码对接教程
  7. 超级卡特兰数(又称大施罗德数)
  8. docker笔记之部署安装
  9. Java 仿QQ空间评论 后台代码实现 一张表
  10. 阿里云网站备案申请被驳回的问题解答汇总