1. 前言:Observable
Rx.Observable: 可觀察對象。簡單理解就是一個可以被subscribe
的對象,它作為數(shù)據(jù)源會不斷的通過next
產(chǎn)生新的數(shù)據(jù)。
舉個例子:
- 當(dāng)前Observable是一個計(jì)數(shù)器
- 每次的
next
數(shù)據(jù)加1 - 訂閱該Observable即可得到當(dāng)前的計(jì)數(shù)
Rx.Observable.create(observer => {
observer.next(1);
observer.next(2);
observer.next(3);
}).subscribe(count => {console.log(count)})
2. Cold 和 Hot
Rxjs中把觀察者(Observable
)區(qū)分為熱觀察者(Hot Observable
)以及冷觀察者(Cold Observable
)。
定義:
- Cold:訂閱后可以<u>接收到當(dāng)前可觀察對象產(chǎn)生的所有數(shù)據(jù)</u>。
- Hot:訂閱后僅可以<u>接收到訂閱時間點(diǎn)之后產(chǎn)生的數(shù)據(jù)</u>。
理解:
? 將Observable看作一個Event Emiter
,它要做的是將新數(shù)據(jù)往外拋,那么實(shí)際上它還需要一個產(chǎn)生數(shù)據(jù)的Producer
。我們理解Cold/Hot觀察者就可以理解為:
- Cold:Data Producer在observable內(nèi)部,每次訂閱后會new Producer,所有數(shù)據(jù)都會重新發(fā)一次。
- Hot:Data Producer是在Observable外部,每次訂閱后Producer不受影響,繼續(xù)保持當(dāng)前狀態(tài)產(chǎn)生數(shù)據(jù)。
// cold
Rx.Observable.create(observer => {
const producer = new Producer()
...
})
// hot
const producer = new Producer()
Rx.Observable.create(observer => {
...
})
形象的比喻:
? 把Observable看作一個音樂播放器:
- Cold:給每個聽歌的人發(fā)CD,每個人都可以聽完所有歌。
- Hot:只有一張CD大家一起聽,先來的人聽得多,后來的人只能聽剩下的。
3. 使用場景
? 實(shí)際上大部分時候我們都是使用的cold observable,每個訂閱者都可以完整的接收到觀察對象的數(shù)據(jù),當(dāng)然也有使用到Hot的情況,同樣以計(jì)數(shù)器來說:
? 計(jì)數(shù)器在一開始就啟動
- 需要查看整個增長動態(tài)變化情況,長期保持訂閱 => Cold
- 僅需要查看當(dāng)前時間段的增長,隨時可能取消訂閱 => Hot
以上是對于Cold和Hot Observable的一些個人總結(jié),有不對的地方歡迎指正。謝謝。