携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
RxJS 中含有两个基本概念:Observable 与 Observer。Observable 作为被观察者,是一个值或事件的流集合,而 Observer 则作为观察者,根据 Observable 进行处理。
Observable 与 Observer 之间的观察者模式如下:
- 订阅:Observer 通过 Observable 提供的 subscribe() 方法观察 Observable。
- 发布:Observable 通过回调 next 方法向 Observer 发布事件。
Observable
Observable的本质其实就是一个随时间不断产生数据或事件的一个集合,也可以说是流。它能够被多个Observer(观察者)订阅,每个订阅关系相互独立,互不影响。
如上图,Observable是一个数据集合,它可以静态指定数据集合,或者动态生成数据。它有三个订阅者Observer,三个订阅者都订阅了这个Observable,也就是有三个订阅关系。假设,Observer1第一个订阅了,紧接着Observer2也订阅了,然后Observer3也订阅了,这些订阅是有先后顺序的。然后,Observable发射了一个新的数据,那这时候Observer1接收到数据,然后Observer2接收到,再是Observer3接收到。
Observer
Observer观察者,是定义了如何处理Observable产生的数据。简单来说,就是Observable产生了数据,我订阅了,所以一旦有新的数据,会获得通知,获得通知之后,我会去根据这个数据会去做的一些事情。直白一点说,就是一个回调函数,回调函数的参数就是新的数据,回调函数的功能就是获得通知之后要做的事情。
Observer 接口定义:
interface Observer<T> {
closed?: boolean; // 标识是否已经取消对Observable对象的订阅
next: (value: T) => void;
error: (err: any) => void;
complete: () => void;
}
Observer 中的三个方法的作用:
- next - 每当 Observable 发送新值的时候,next 方法会被调用;
- error - 当 Observable 内发生错误时,error 方法就会被调用;
- complete - 当 Observable 数据终止后,complete 方法会被调用。在调用 complete 方法之后,next 方法就不会再次被调用;
这里先不上代码,后面会有详细的例子展示,先理解概念为主。
Subscription
Subscription,它可以停止一个启动后的流。每一个启动后的流都是相互独立的,如果想清理掉这个观察者,就可以用Subscription来清理掉,最常用的就是调用它的unsubscribe。
到这里为止,我们已经理解了Observable,Observer,Subscription。总结一下,Observable定义了要生成一个什么样的数据,Observable可以被Observer来订阅,订阅后的关系就是Subscription,可以取消掉这种订阅关系。
Subscription = Observable.subscribe (observer)
observable: 随着时间产生的数据或事件的集合,可以理解为流;
observer: 决定如何处理数据;
subscription: 订阅关系,可以取消订阅关系;
了解了基本的Observable和Observer的概念后,先来看一个简单的例子。
const { Observable, of } = require('rxjs');
const ob$ = new Observable((observer) => {
observer.next(1);
observer.next(2);
observer.complete();
});
ob$.subscribe((data) => {
console.log('第一个:', data);
}, null, () => {
console.log('第一个完成');
});
了解了Observable和Observer后,还有一个概念Subject也非常重要,而且有各种Subject到变体。