RxJS简介

promise

ES6中引入了Promises来解决回调地狱问题。promise代表了异步程序,一旦创建立即开始运行,并在未来某个时刻完成。然而promise也有自身的缺点:
数据源产生多个值,比如鼠标移动事情或者文件系统的字节流;
没有失败重试的机制;
没有取消机制;

RxJS

RxJS 是使用 Observables的响应式编程的库,它使编写异步或基于回调的代码更容易。用于 JavaScript 的 ReactiveX 库。
RxJS中,产生事件的快慢与否取决于我们的需求。
万物皆stream。
响应式编程,又称函数化反应编程,是一种处理异步数据流的编程方法。可观察对象是用来实现响应式编程的主要数据结构。表达做什么,而不是怎么做。

安装
//通过npm安装ES6版本
npm install rxjs

//导入整个核心功能集
import Rx from 'rxjs/Rx'
参考

RxJS官网
RxJS官网中文版

核心元素

Observable

在RxJS中的生产者叫做Observables。Observables负责推送事件,但不处理事件。
1. 创建observable
当你想要包装随时间推移产生值的功能时,普通的 Observable 就已经很好了。使用Subject,你可以从任何地方触发新事件,并且将已存在的 observables 和它进行连接。
2. 转换成observable
创建与转换成observable


Observer

在RxJS中的消费者叫做Observer。数据只会从生产者流向消费者


pipeline

在管道里是一个接一个的函数,管道的左边接到Stream上,即数据源,数据将会流经管道,并按顺序作为参数传递给每一个函数。管道的右边连接着的是最终使用数据的程序,我们称之为数据消费者。管道中的一个一个函数称为Observable operators,简称operators.


Subscription

Subscription 是表示可清理资源的对象,通常是 Observable 的执行。

unsubscribe方法

Subscription 基本上只有一个 unsubscribe() 函数,这个函数用来释放资源或去取消 Observable 执行。此函数不需要参数。

多个subscription的合并与分散

add(childSubscription):把多个subscription合在一起,这样一个Subscription调用unsubscribe()方法,可能会有多个Subscription取消订阅 。
remove(childSubscription):撤销一个已添加的子Subscription。


operator
实例操作符

通常提到操作符时,我们指的是实例操作符,它是Observable实例上的方法。实例运算符是使用 this 关键字来指代输入的 Observable 的函数。

静态操作符

静态操作符在内部不使用this关键字,而是完全依赖于它的参数。最常用的静态操作符类型是所谓的创建操作符。一些组合操作符也可以当做静态操作符来使用,比如 merge、combineLatest、concat,等等


Subject

Subject像是Observalbe,但是可以多播给多个观察者。而普通的Observables是单播的,即每个已订阅的观察者都拥有Observable的独立执行。
从观察者的角度而言,它无法判断Observable执行是来自普通的Observable 还是Subject 。
在Subject 的内部,subscribe**不会调用发送值的新执行**。它只是将给定的观察者注册到观察者列表中。

类似Observer

每个 Subject 都是观察者。 Subject 是一个有如下方法的对象: next(v)、error(e) 和 complete() 。要给 Subjetc提供新值,只要调用 next(theValue),它会将值多播给已注册监听该 Subject 的观察者们
也可以把Subject作为参数传给任何Observable的subscribe方法,如observable.subscribe(subject)

multicast多播

multicast方法返回的是ConnectableObservable,它只是一个有connect()方法的 Observable 。
具体参考下篇博客中multicast操作符。

refCount引用计数

手动调用connect()并处理Subscription通常太笨重。通常,当第一个观察者到达时自动地连接,而当最后一个观察者取消订阅时自动地取消共享执行。
refCount() 只存在于ConnectableObservable,它返回的是Observable,而不是另一个ConnectableObservable 。
具体参考下文中refCount操作符。

Subject的类型
BehaviorSubject

它有一个“当前值”的概念。它保存了发送给消费者的最新值。并且当有新的观察者订阅时,会立即从 BehaviorSubject 那接收到“当前值”。
可以自己指定值来进行初始化。如:

var subject = new Rx.BehaviorSubject(0); // 0是初始值

subject.subscribe({
  next: (v) => console.log('observerA: ' + v)
});

subject.next(1);
subject.next(2);

subject.subscribe({
  next: (v) => console.log('observerB: ' + v)
});

subject.next(3);

输出:
observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3

ReplaySubject

类似于BehaviorSubject,记录Observable执行中的多个值并将其回放给新的订阅者。
当创建 ReplaySubject 时,你可以指定回放多少个值:
var subject = new Rx.ReplaySubject(3); // 为新的订阅者缓冲3个值

AsyncSubject

只有当 Observable执行完成时(执行complete()),它才会将执行的最后一个值发送给观察者。


Scheduler

调度器控制着何时启动subscription和何时发送通知。注意以下三点:
1. 调度器是一种数据结构。 它知道如何根据优先级或其他标准来存储任务和将任务进行排序
2. 调度器是执行上下文。 它表示在何时何地执行任务(举例来说,立即的,或另一种回调函数机制(比如 setTimeout 或 process.nextTick),或动画帧)。
3. 调度器有一个虚拟时钟
调度器功能通过它的getter方法now()提供了“时间”的概念。在具体调度器上安排的任务将严格遵循该时钟所表示的时间。

调度器的类型

可以通过使用 Scheduler对象的静态属性创建并返回其中的每种类型的调度器。
1. null: 不传递任何调度器的话,会以同步递归的方式发送通知。用于定时操作或尾递归操作。
2. Rx.Scheduler.queue: 当前事件帧中的队列调度(蹦床调度器)。用于迭代操作。
3. Rx.Scheduler.asap: 微任务的队列调度,它使用可用的最快速的传输机制,比如 Node.js 的 process.nextTick() 或 Web Worker 的 MessageChannel 或 setTimeout 或其他。用于异步转换。
4. Rx.Scheduler.async: 使用 setInterval 的调度。用于基于时间的操作符。

调度器的使用

如果没有显式提供调度器的话,RxJS会通过使用最小并发原则选择一个默认调度器。这意味着引入满足操作符需要的最小并发量的调度器会被选择。
例如,对于返回有限和少量消息的 observable 的操作符,RxJS 不使用调度器,即 null或undefined。对于返回潜在大量的或无限数量的消息的操作符,使用queue调度器。对于使用定时器的操作符,使用aysnc 调度器。

如果出于性能考虑,你想要引入并发,那么可以选择不同的调度器。

静态创建操作符通常可以接收调度器作为参数。

使用 subscribeOn 来调度subscribe()调用在什么样的上下文中执行。使用 observeOn 来调度发送通知的的上下文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值