看個例子:
const myObservable = of(1, 2, 3);
// 建立一個觀察者對象-Observer(處理next、error、complete回調)
const myObserver = {
next: x => console.log('Observer got a next value: ' + x),
error: err => console.error('Observer got an error: ' + err),
complete: () => console.log('Observer got a complete notification'),
};
// 通過Observable的subscribe函數,觀察者去訂閱可觀察者的消息
myObservable.subscribe(myObserver);
調用Observable的subscribe方法,傳入一個包含回調函數的observer對象:
後兩個參數都是undefined:
在toSubscriber函數裡,因為nextOrObserver是我手動傳入的對象,是以前兩個IF條件均不滿足:
進入預設實作,建立一個Subscriber對象:
Subscriber是Subscription的子類:
我們現在的Subscriber的構造函數裡,建立一個SafeSubscruber執行個體:this作為parent subscriber傳入
從SafeSubscriber的實作能看出,傳入的Observer對象的next,error和complete這些函數名稱都是寫死的,必須符合這個命名規範:
執行subscribe:
sink的destination包含了應用程式傳入的complete, next, error邏輯:
這裡能看到,subscribe的邏輯就是,周遊所有Observable參數,依次調用observer的next方法,最後再調用一次complete方法:
this._next調用this.destination.next:
最終調用到應用程式員傳入的next方法:
最後的輸出: