以前一直在寫LINQ之類的東西,對於函數式的面向對象仍是有一些功底,因此對於rxjs,感受上不是很難,可是每次看完過幾天就忘,仍是記一下筆記吧,好記性不如爛筆頭真不是蓋的。函數
首先介紹幾個重要的概念。this
能夠經過這個URL來詳細瞭解相關知識:https://www.jianshu.com/p/f2f87925b229spa
rxjs中有幾個重要的概念,有Observable、Observer、Subject,他們參考了觀察者模式(或者叫發佈/訂閱模式)和迭代器模式。rxjs中有一個數據流的概念,和LINQ很相似,能夠想象有一根管道,數據緩緩從管道中流過。發送數據的角色是生產者,消費數據的角色是觀察者,觀察者要想消費數據的話得知道生產者何時發送數據,也就是說,觀察者要從生產者訂閱一下通知,以便及時消費數據,這個過程就是由Observable來完成的。code
Observevable是一個對象,若是要建立一個Observable,能夠從以下兩個例子來看:server
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內部能夠想象成這樣的一種結構:blog
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還有冷和熱的的區別,這個之後補充,如今着急介紹下一個功能。rxjs
subject是Observable和Observer的結合,從Observable來看,subject自己是繼承了Observable,從Observer來看,subject是observer的鴨子類型(兼容)。Subject的內部是這樣的:ip
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是多播的(組播),它能夠經過一個生產者調動多個觀察者。
基礎的只知識就介紹到這裏,下面介紹操做符。