自学 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 文档,那就死文档吧 。

通俗理解RxJS(一)的更多相关文章

  1. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  2. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  3. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  4. 关于MySQL中的自联结的通俗理解

    关于MySQL中的自联结的通俗理解 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有表格的代码都是来自SQL必知 ...

  5. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  6. OSI七层模式简单通俗理解

    OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OS ...

  7. 通俗理解决策树中的熵&条件熵&信息增益

    参考通俗理解决策树算法中的信息增益 说到决策树就要知道如下概念: 熵:表示一个随机变量的复杂性或者不确定性. 假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2 ...

  8. CNN笔记:通俗理解卷积神经网络【转】

    本文转载自:https://blog.csdn.net/v_july_v/article/details/51812459 通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012 ...

  9. 通俗理解LDA主题模型

    通俗理解LDA主题模型 0 前言 印象中,最開始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印 ...

随机推荐

  1. Unity3D protobuf-net使用方式

    1.下载protobuf-net 2.创建Unity工程,创建一个Plugins文件夹,将protobuf-net解压把里面得protobuf-net放到Plugins 3.创建一个名为mcs的文本文 ...

  2. 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性

    在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...

  3. Docker Compose 版本过高(Docker版本不匹配),降低docker-compose版本

    通过docker-compose启动容器,报错: ERROR: The Docker Engine version is less than the minimum required by Compo ...

  4. 【JSP】JSP中的Java脚本

    前言 现代Web开发中,在JSP中嵌入Java脚本不是推荐的做法,因为这样 不利于代码的维护.有很多好的,替代的方法避免在JSP中写Java脚本.本文仅做为JSP体系技术的一个了解.     类成员定 ...

  5. Win8安装msi程序出现2502、2503错误解决方法

    在Win8中,在安装msi安装包的时候常常会出现代码为2502.2503的错误.其实这种错误是由于安装权限不足造成的,因为这种msi的安装包不像其他exe的安装程序, 在安装包上点击"右键& ...

  6. windows下java开发资料汇总

    开发环境搭建:   (1) java开发环境配置    (2) maven环境快速搭建        项目部署:   (1) Eclipse中项目部署方法   (2) 使用Eclipse构建Maven ...

  7. Spark2 Dataset统计指标:mean均值,variance方差,stddev标准差,corr(Pearson相关系数),skewness偏度,kurtosis峰度

    val df4=spark.sql("SELECT mean(age),variance(age),stddev(age),corr(age,yearsmarried),skewness(a ...

  8. 170821、本地代码上传gitlub

    第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令 git init #初始化项目 第二步:将项目的所有文件添加到仓库中 git add . 或者git add -A #如果想添加某个 ...

  9. 170817、Nginx详细配置

    Nginx能做什么 nginx主要是做转发,当然也可以做静态资源文件缓存,做转发的时候,比如你有几个url,可以统一通过走nginx,然后通过nginx转发到不同的url上 1.反向代理 反向代理应该 ...

  10. java中List的toArray方法

    把List转换成某种类型的数组,就拿String类型来做例子吧,有以下两种方式: //方法1,使用不带参数的toArray方法 String[] arr1=new String[list.size() ...