rxjs pipe和filter组合的一个实际例子的单步调试
源代码:const source$ = range(0, 10);
range(0,10)返回一个新的Observable,但是不会立即执行,直到遇到subscribe调用为止:
下图高亮的这段代码,在Observable.subscribe后会执行:
注册到Observable的_subscribe里:
源代码:
ngOnInit(): void {
console.log('before ngOnInit');
const source$ = range(0, 10);
source$.pipe(
filter((x, index) => {
console.log('inside filter!: ' + x + ' index: ' + index);
return x % 2 === 0 }),
map( x => {
console.log('inside map: ' + x);
return (x + x); }
),
// scan((acc, x) => acc + x, 0)
scan(this.accumulator)
)
.subscribe(x => console.log('result: ' + x));
}
pipe调用的参数传入的是filter, map和scan三个操作的结果,因此首先执行filter: 位于operators目录里:
filter操作接收的参数predicate, 类型是一个函数,该函数接收x和index两个参数,返回boolean类型,这就是所谓的filter-过滤器。filter操作返回一个新的函数,该函数接收一个新的输入source,对source调用lift操作,施加predicate操作。
然后执行pipe操作:
pipe的输入参数就是filter调用的返回结果:
pipeFromArray返回的就是包裹了filter操作的filterOperatorFunction:
进入之前filter调用返回的新函数:
这个source应该是range(0,10)返回的Observable:
对原始Observable对象调用filter返回的predicate操作:
life操作内部新建了一个Observable对象,source是原始Observable对象,operator就是filter对应的predicate.
Observable遇到subscribe方法才会真正地执行Observable内部的方法:
新建一个subscriber,第一个输入参数nextOrObserver就是应用程序里subscribe方法里传入的箭头函数:
subscriber是subscription的子类:
next就是应用程序传入的箭头函数:
注意这里,sink已经准备调用operator了。operator就是filter操作:
进入filter操作:
开始执行subscribe:
执行complete的条件:
调用next:
由此可见,range Observable里包含的值,逐一调用filter:
如果filter返回true,继续调用下一个Observable对象:
这里最终就调用应用程序里传入的subscribe方法了:
range = 0的value已经执行完毕了,下面进行range1:
因为range = 1时filter返回false,所以Observable链式执行到这里就中断了:
range = 2,下面的原理类似,不重复介绍了。
- 想起温习一下JS中的this apply call arguments
- 学习利用JSON 摆脱表单与业务对象双向转换的繁琐工作
- 代码也疯狂:diagram生成流程图
- 设置你的Gravatar头像的方法
- 阅读Ext 学习Javascript(二)Core/Ext.extend 从继承说起
- IronPython资料
- WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式一)
- encodeURIcomponent编码和ASP.NET之间编码转换
- WordPress免插件仅修改代码去掉评论/留言里的链接
- 阅读Ext 学习Javascript(一)Core/Ext.js
- 利用腾讯的ip地址库做ip地址定位
- WordPress登陆不了后台的原因及解决方法(登陆界面不断返回)
- select元素的options.add 与 insertbefore的区别
- 如何去理解 拓扑排序算法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 值得一看的35个Redis面试题总结
- 容器技术|Docker三剑客之docker-machine
- 企业面试题|最常问的MySQL面试题集合(三)
- 「微服务架构」API版本控制最佳实践介绍
- 2020年最新字节、阿里、腾讯、爱奇艺等BAT Android社招高频面试题,押题99.98%!
- 使用镜像部署 Hexo 静态页面
- 基于zmq RPC简单C++实现
- App为什么会crash?一篇文章带你探究根本原因 ,事情没有你想得那么简单!
- MySQL 8.0新特性 — 用户管理
- Java15的新特性
- ZooKeeper到底为Kafka的做了什么牺牲?
- Flutter原理:三棵重要的树(渲染过程、布局约束、应用视图的构建等)
- FlutterDojo设计之道—状态管理之路(六)
- Day9.函数进阶
- 关于requests.exceptions.SSLError: HTTPSConnectionPool