【Rxjs】Rxjs_Subject 及其衍生類

Rxjs_Subject 及其衍生類

在 RxJS 中,Observable 有一些特殊的類,在消息通信中使用比較頻繁,下面主要介紹較常用的幾個類:

1/ Subject

Subject 可以實現一個消息向多個訂閱者推送消息。

Subject 是一種特殊類型的 Observable,它允許將值多播給多個觀察者,所以 Subject 是多播的,而普通的 Observables 是單播的(每個已訂閱的觀察者都擁有 Observable 的獨立執行)。

每個 Subject 都是觀察者。 - Subject 是一個有如下方法的對象: next(v)、error(e) 和 complete() 。要給 Subject 提供新值,只要調用 next(theValue),它會將值多播給已註冊監聽該 Subject 的觀察者們。

var subject = new Rx.Subject(); //實例化一個Subject對象
subject.next(1); //向接受者發送一個消息流
subject.subscribe({
  next: value => console.log("observerA: " + value) //接受者A訂閱消息,獲取消息流中的數據
});
subject.subscribe({
  next: value => console.log("observerB: " + value) //接受者B訂閱消息,獲取消息流中的數據
});

這樣兩路接受者都能拿到發送的數據流:

observerA:1
observerB:1

2/ BehaviorSubject

BehaviorSubject 是 Subject 的一個衍生類,它將數據流中的最新值推送給接受者。

var subject = new Rx.BehaviorSubject(0); //聲明一個 BehaviorSubject 對象
subject.next(1); //發送一個數據流
subject.next(2); //再發送一個數據流
subject.subscribe({
  next: v => console.log("observerA: " + v) //接受者 A 訂閱消息
});
subject.subscribe({
  next: v => console.log("observerB: " + v) //接受者 B 訂閱消息
});
subject.next(3); //再發送一個數據流

這樣,每次接受者只會接受最新最送的那個消息:

observerA:2
observerB:2
observerA:3
observerB:3

3/ ReplaySubject

ReplaySubject 類似於 BehaviorSubject,它可以發送舊值給新的訂閱者,但它還可以記錄 Observable 執行的一部分。

當創建 ReplaySubject 時,你可以指定回放多少個值:

var subject = new Rx.ReplaySubject(3); // 爲新的訂閱者緩衝3個值

subject.subscribe({
  next: v => console.log("observerA: " + v)
});

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

subject.subscribe({
  next: v => console.log("observerB: " + v)
});

subject.next(5);

輸出:

observerA: 1
observerA: 2
observerA: 3
observerA: 4
observerB: 2
observerB: 3
observerB: 4
observerA: 5
observerB: 5

4/ AsyncSubject

AsyncSubject 是另一個 Subject 變體,只有當 Observable 執行完成時(執行 complete()),它纔會將執行的最後一個值發送給觀察者。

var subject = new Rx.AsyncSubject();

subject.subscribe({
  next: v => console.log("observerA: " + v)
});

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

subject.subscribe({
  next: v => console.log("observerB: " + v)
});

subject.next(5);
subject.complete();

輸出:

observerA: 5
observerB: 5
參考文檔

《PublishSubject,ReplaySubject,BehaviorSubject,AsyncSubject》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章