Rx 入门指引 (一)
自学 Rx 快有一个周了, 它非常适合处理复杂的异步场景。结合自己所学,决定写系列教程。
我认为, Rx 中强大的地方在于两处
- 管道思想,通过管道,我们订阅了数据的来源,并在数据源更新时响应 。
- 强大的操作符,通过操作符对流和流中的数据转换,拼接,以形成我们想要的数据模型 。
数据管道
在 Rx 中,我们先预装好管道,通过管道流通数据 。这些管道的来源多种, create ,from, fromEvent, of .., 通过操作符将管道 拼接,合并,映射...形成最终的数据模型 。
对于管道来说,有两点非常重要
- . 管道是懒执行的,只有订阅器 observer subscribe了 数据管道,这个管道才会有数据流通 。
- . 整个节点组成一个完整的管道,订阅了后面的管道节点,也会同时订阅之前的管道节点 ,每个节点接受之前的值,并发出新值。
在很多教程中, Rx 往往以这个例子开始 :
const example = Rx.Observable.create ((observer) => {
const timer = setTimeout(() => {
observer.next(8);
})
observer.next(10);
return () => {
clearTimeout(timer);
}
})
const unsubscribe = example.subscribe((a) => {
console.log(a);
})
//结果当然是 10, 8.
这个例子发现了两种相似的设计模式
- 迭代器模式
- 观察者模式
迭代器模式:类似于 JS 6 增加的迭代器 。
const iterator = [1, 2, 3][Symbol.iterator]();
while(true) {
const result = iterator.next();
if(result.done) return;
cnosole.log(result.value);
}
观察者模式: 事件模型是最常见的观察者模式, 定义生产者与消费者,生产者发出值,消费者收到消息,并执行相应行文 。 Observable 与其不同的是, Observable 是拉模型,懒执行,只有指定订阅者,生产者才会派发。 Rx 中的推模型实现Subject 就是采用观察者模式,不管有没有订阅者,都会推送数据 。
操作符
Rx 如此高效和强大,得益于其强大的操作符 。
主要包含下面几类
- 创建操作符: create, range, of, from, fromEvent, fromPromise, empty ..
- 组合 contact ,merge, startWith, zip ..
- 时间 delay , throttle, dobounceTime, interval ..
- 过滤: filter, first, last, skip, distinct, take ..
- 转换: buffer,map, mapTo, mergeMap, switch, switchMap, reduce, scan ..
- 工具: do, toPromise ..
vs Promise
很多大牛介绍,在相对简单的情况下,大可不必使用 Observable ,Promise 足以应对。
类似于下面的模型
new Promise ((resolve, reject) = {})
.then()
.then()
.then() ...
这种模型非常大程度改善了 回调地狱, 也能处理大部分的异步场景,name 对于 Rx , 它有哪些地方不足呢 ?
- Rx 抽象了数据的来源,主要是对事件和网络请求的抽象 。
- Rx 可以多次发出数据, 而Promise 只能发出一次数据, 复用之前的管道。
- Rx 可以是懒执行的,只有在订阅之后,才会发出值,也就是订阅 。 而Promise 在定义后理解执行 。
- 注意到我们上面的例子,是可以cancle 取消订阅的。
return () => {
clearTimeout(timer);
}
})
const unsubscribe = example.subscribe((a) => {
console.log(a);
})
create 会返回一直函数,这个函数用于清理管道执行产生的垃圾,比如这里的定时器 。调用 unsubscribe 会取消订阅,并执行清理函数。
- Promise 中数据变换只有通过then 链来进行,这点在fetch API 中体现最明显。但是Rx包含大量的操作符,简化了很多运算 。
尾声
在这一篇, 我介绍了Rx 的概念,以及与Promise 的对比,理解Rx ,主要是理解管道思想和响应式编程 。说Rx 门槛高,也就是新手们管道思想和响应式编程在前端的实践不多。
在下一篇,会分类使用所有的操作符,如果算是API 文档,那就死文档吧 。
Rx 入门指引 (一)的更多相关文章
- Windows驱动开发入门指引
1. 前言 因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结. 对于驱动开发的开发指引,微软 ...
- PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
一.框架的由来 快速入门 有关框架的更多信息,请看框架官方主页! 本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.N ...
- Rx 入门 示例
首先写一个观察者模式 public interface Watcher { public void update(String str); } public class ConcreteWatcher ...
- 【转】python入门指引
http://matrix.42qu.com/10757179 前言 其实我也不知道python怎么入门,由我来写这个真的不是很合适.我学python是直接找了dive into python来看.然 ...
- Shiro入门指引
最近项目中用到Shiro,专门对其研究了一番,颇有收获,以下是笔者最近写的博客,希望对大家入门有所帮助. Shiro入门资源整理 Shiro在SpringBoot中的使用 Shiro源码解析-登录篇 ...
- Spring源码阅读入门指引
本文大概的对IOC和AOP进行了解,入门先到这一点便已经有了大概的印象了,详细内容请看下文. AD: 本文说明2点: 1.阅读源码的入口在哪里? 2.入门前必备知识了解:IOC和AOP 一.我们从哪里 ...
- PHP-Manual的学习----【入门指引】
2017年6月27日17:03:53 笔记:简介 PHP是什么? PHP能做什么?1.PHP("PHP: Hypertext Preprocessor",超文本预处理器 ...
- UI入门指引
1. iOS学习路线: C语言:数据类型.流程控制.函数.指针.字符串.结构体.枚举.预处理: OC:面向对象.内存管理.分类.协议.Block.KVC/KVO.Foundation框架: iOS基础 ...
- plain framework 1 参考手册 入门指引之 许可协议
许可 介绍 Apache2 License 介绍 使用非常友好的阿帕奇2许可协议,你可以应用到你想用的任何应用上,如需修改源码,请保留原作者信息. Apache2 License Apache Lic ...
随机推荐
- Java log4j使用
log4j下载地址: http://logging.apache.org/log4j/1.2/download.html 本人用的是log4j-1.2.17.jar的jar包. 接下来我们配置下一lo ...
- Java GUI+mysql+分页查询
1.要求 : 创建一个学生信息管理数据库 2.实现分页查询 代码如下: a)学生实体类: /** * @author: Annie * @date:2016年6月23日 * @description: ...
- 团队作业八——第二次团队冲刺(Beta版本)第6天
团队作业八--第二次团队冲刺(Beta版本)第6天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题 ...
- eclipse ide for java ee developers与eclipse ide for java developers有什么区别
前者集成了WTP,可用于j2ee开发,功能更完善
- 201521123011 《java程序设计》 第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- 201521123074 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 201521123026《Java程序设》 第10周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 1.守护线程:setDaemon(true or false),如果所有前台线程死亡,守护线程自动结束,一般 ...
- 201521123079《java程序设计》第14周学习总结
PTA反馈问卷 雨课堂反馈问卷 本次作业参考文件 数据库PPT MySql操作视频与数据库相关jar文件请参考QQ群文件. 本周课程设计发布 Java课程设计 本周学习总结 1.1 以你喜欢的方式(思 ...
- 201521123092《java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...
- 懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法
在开发的过程中,我们为了节约时间,往往会将大量重复机械的代码封装,考虑代码的复用性,这样我们可以节约很多时间来做别的事情.最近跳槽到一节webform开发的公司,主要是开发自己公司用的ERP.开始因为 ...