-
Notifications
You must be signed in to change notification settings - Fork 0
Description
什么是RxJS?
RxJS是ReactiveX编程理念的JavaScript版本。ReactiveX来自微软,它是一种针对异步数据流的编程。简单来说,它将一切数据,包括HTTP请求,DOM事件或者普通数据等包装成流的形式,然后用强大丰富的操作符对流进行处理,使你能以同步编程的方式处理异步数据,并组合不同的操作符来轻松优雅的实现你所需要的功能。
初级核心概念
Observable和Observer
1.Observable就是“可以被观察的对象”即“可被观察者”,而Observer就是“观察者”
2.RxJS中的数据流就是Observable对象
const ob = Observable.interval(1000); ob.take(3).map(n => n * 2).filter(n => n > 2);
第一步代码我们通过类方法interval创建了一个Observable序列,ob作为源会每隔1000ms发射一个递增的数据,即0 -> 1 -> 2。第二步我们使用操作符对流进行处理,take(3)表示只取源发射的前3个数据,取完第三个后关闭源的发射;map表示将流中的数据进行映射处理,这里我们将数据翻倍;filter表示过滤掉出符合条件的数据,根据上一步map的结果,只有第二和第三个数据会留下来。
上面我们已经使用同步编程创建好了一个流的处理过程,但此时ob作为源并不会立刻发射数据,如果我们在map中打印n是不会得到任何输出的,因为ob作为Observable序列必须被“订阅”才能够触发上述过程,也就是subscribe(发布/订阅模式)。
const ob = Observable.interval(1000); ob.take(3).map(n => n * 2).filter(n => n > 0).subscribe(n => console.log(n));
结果:
2 //第2秒 4 //第3秒
上面代码中我们给subscribe传入了一个函数,这其实是一种简写,subscribe完整的函数签名如下:
ob.subscribe({ next: d => console.log(d), error: err => console.error(err), complete: () => console.log('end of the stream') })
Hot Obsevable Cold Observable
一个Observable对象(发布者)有两个Observer对象(订阅者)来订阅,而且这两个Observer对象并不是同时订阅,第一个Observer对象订阅N秒钟之后,第二个Observer对象才订阅同一个Observable对象,而且,在这N秒钟之内,Observable对象已经吐出了一些数据。现在问题来了,后订阅上的Observer,是不是应该接收到“错过”的那些数据呢?
选择A:错过就错过了,只需要接受从订阅那一刻开始Observable产生的数据就行。
选择B:不能错过,需要获取Observable之前产生的数据。
不同的场景不同的选择:
电视台的任何一个频道的节目如果看作是一个Observable对象,那么每一台电视机就是一个Observer,当你打开电视切换到一个频道的时候,相当于subscribe上了对应频道的Observable,毫无疑问,切换到某个频道,你所看到的节目内容就是从那一刻开始的,不包含之前的内容,所以,对于电视这个场景,恰当的答案是选择A
视频点播网站上可供点播的每一个剧集看作一个Observable对象,那么你观看Hulu的浏览器就是Observer。当你在浏览器中打开某个电视剧的某一集,就是从这一集的第一秒钟开始播放,另一个用户在另一个时间另一台电脑上打开同样的剧集,也是从第一秒钟开始播放,互相没有影响,这就是选择B。
选择A,称这样的Observable为Hot Observable
选择B,称之为Cold Observable。