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 ...
随机推荐
- python--简易购物车实现
目标要求: 1.用户输入购物预算 2.打印商品清单,由用户选择,预算够则购买,不够则提示 3.输入q,退出程序 4.购物结束,显示购买的东西和余额 实现: 1.用列表存储商品及价格信息 2.建立空列表 ...
- 个人作业2——英语学习APP案例分析(必应词典的使用)
第一部分 调研, 评测 1.使用环境:window 10 词典版本: 2.使用体验: 打开词典出现下面这一界面: 词典模块:出现了每日一词,每日一句,每日阅读板块,还提供了生词本,个人觉得最喜欢的是这 ...
- 扫雷游戏制作过程(C#描述):第一节、创建项目
前言 起初做扫雷是同学在做,我也跟着做了.做的比较low,其实第一次做这种东西,自己对自己的要求也不高,注重在了解一下,一个app应用程序是怎么产生的..net开发平台,用c#敲的.建议大家一些不懂的 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.4.22
昨天来不及编写,这是4月22日的日志,现在补上. 1.开完站立式会议后的合照 2.任务分解图 3.开会讨论的结果,任务分派 队员 今日进展 明日安排 陈鑫龙 原型设计图分析,设计登陆界面原稿 实现登陆 ...
- 201521123085《Java程序设计》第4周学习总结
1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2.书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对 ...
- 201521123053《Java程序设计》第1周学习总结
1. 本周学习总结 第一次接触Java,让我感到很吃力,有些困难.但我知道接触所有新事物都会困难,慢慢来就好. 下面是我这周的学习总结: one 第一节课 老师上课太快了,而且我没预习,根本跟不上 ...
- [BT5]信息收集1-1 Dnsenum
0.工具介绍 The purpose of Dnsenum is to gather as much information as possible about a domain. The progr ...
- POJ 3625 最小生成树 Prim C++
Building Roads Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11861 Accepted: 3376 D ...
- String StringBuffer StringBuilder 之间的区别
StringBuffer与StringBuilder的区别: StringBuffer是jdk1.0版本出来的,线程安全,效率低 StringBuilder是jdk1.5版本出来的,线程不安全,效率高 ...
- Apache CXF入门
CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了.CXF 继承了 Celtix 和 XFire 两大 ...