异步数据流的响应式编程库Rxjs(三)核心概念Observable 与 Observer

119 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

RxJS 中含有两个基本概念:ObservableObserverObservable 作为被观察者,是一个值或事件的流集合,而 Observer 则作为观察者,根据 Observable 进行处理。

ObservableObserver 之间的观察者模式如下:

  • 订阅: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。

到这里为止,我们已经理解了ObservableObserverSubscription。总结一下,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('第一个完成');
});

了解了ObservableObserver后,还有一个概念Subject也非常重要,而且有各种Subject到变体。