1. 程式人生 > >rxjs一句話描述一個操作符(1)

rxjs一句話描述一個操作符(1)

構造 有一個 函數式 組播 訂閱 發布 ext push 訂閱模式

之前一直在寫LINQ之類的東西,對於函數式的面向對象還是有一些功底,所以對於rxjs,感覺上不是很難,但是每次看完過幾天就忘,還是記一下筆記吧,好記性不如爛筆頭真不是蓋的。

首先介紹幾個重要的概念。

可以通過這個URL來詳細了解相關知識:https://www.jianshu.com/p/f2f87925b229

rxjs中有幾個重要的概念,有Observable、Observer、Subject,他們參考了觀察者模式(或者叫發布/訂閱模式)和叠代器模式。rxjs中有一個數據流的概念,和LINQ很類似,可以想象有一根管道,數據緩緩從管道中流過。發送數據的角色是生產者,消費數據的角色是觀察者,觀察者要想消費數據的話得知道生產者什麽時候發送數據,也就是說,觀察者要從生產者訂閱一下通知,以便及時消費數據,這個過程就是由Observable來完成的。

Observable

Observevable是一個對象,如果要創建一個Observable,可以從如下兩個例子來看:

 const observable$ = new Observable<number>(observer => {
      observer.next(1);
      observer.next(2);
      observer.next(3);
      observer.next(4);
      return {
        unsubscribe: () => {
          console.log(‘complete‘);
        }
      };
    });
    const subscription 
= observable$.subscribe(value => console.log(value));

如上,生產者就是next(1)啊,next(2)啊中的1和2,Observable<number>則表示這個生產者是一個要發送number類型的生產者,給構造函數傳入的function是一個接受一個observer的函數,這個observer對象擁有三個方法分別是next、error和complete。其中next方法用來消費生產者發送出來的數據,error用來捕獲錯誤,complete用來通知完成。沒錯,這個observer就是一個觀察者,觀察者用來消費生產者發布的數據。

Observable內部可以想象成這樣的一種結構:

class observable<T> {
  _subscribe: (observer: Observer<T>) => Unsubscribable;
  constructor(subscriber: (observer: Observer<T>) => Unsubscribable) {
    this._subscribe = subscriber;
  }
  subscribe(observer: Observer<T>): Unsubscribable {
    this._subscribe(observer);
    return { unsubscribe: () => console.log(‘complete‘) };
  }
}

上面的代碼簡單的詮釋了一個Observable的內部結構,Observer<T>是一個觀察者,它擁有next、complete和error三個方法。

除了上面這些,Observable還有冷和熱的的區別,這個以後補充,現在著急介紹下一個功能。

Subject

subject是Observable和Observer的結合,從Observable來看,subject本身是繼承了Observable,從Observable來看,subject是observer的鴨子類型(兼容)。Subject的內部是這樣的:

class subject<T> {
  _observers: Observer<T>[];
  subscribe(observer: Observer<T>): void {
    this._observers.push(observer);
  }
  next(value) {
    this._observers.forEach(item => item.next(value));
  }
  complete() {
    this._observers.forEach(item => item.complete());
  }
  error(value) {
    this._observers.forEach(err => err.error(value));
  }
}

不同於Observable的是Subject是多播的(組播),它可以通過一個生產者調動多個觀察者。

基礎的只知識就介紹到這裏,下面介紹操作符。

rxjs一句話描述一個操作符(1)