Skip to content

rxjs总结 #14

@CarisL

Description

@CarisL

什么是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。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions