[英]Observer subscribe not firing on first load to Component
我有一家商店公開asObservable。 視圖對此進行訂閱並顯示數據。 自從將其更改為Singleton服務以來,它一直處於首次加載狀態,當我第一次進入該頁面時,沒有數據顯示,也沒有觸發訂閱事件。 在對數據執行了一些操作之后,該數據導致subject.next被調用,它會更新,視圖也會更新,一切都很好。
我確保這不是爭用條件問題,並且在調用頁面的構造函數時數據已存儲在存儲區中。
事件順序如下(在調試過程中確認):
即使存儲中存在訂閱事件,也不會觸發訂閱事件,也不會填充任何數據。 如果然后在列表上執行某種操作,一切都會按預期級聯,則調用next(),並發生訂閱事件。
如何獲取頁面以讀取頁面加載數據?
數據存儲
protected _subject$: Subject<Array<any>>;
this._subject$.next(newData); // confirmed via console this happens with good data
get contacts$(): Observable<any> {
return this._subject$.asObservable();
}
組件-我嘗試將下面的塊放入構造函數和ngAfterViewInit中,結果相同
// this happens after the above data is already set
this.contacts$.subscribe(data => {
// this block does not execute on page load
});
事件順序如下(在調試過程中確認):
- 數據從服務器加載
- 使用正確的數據調用subject.next()
- 調用觀察者的組件構造函數
這是因為香草Subject
沒有緩沖任何內容。 發出一條消息時,如果在那個確切的時間沒有人訂閱,則該消息將永遠消失,也沒有人會收到它。
如果要保留對所有訂戶的最后一條消息的緩沖,則可以使用BehaviorSubject
或ReplaySubject
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { ReplaySubject } from 'rxjs/ReplaySubject';
sub1 = new BahaviorSubject<any>(null);
sub2 = new ReplaySubject<any>(1);
在語義上, BehaviorSubject
表示隨時間變化的值,並使用初始值對其進行初始化。 它將始終保留最后一個項目,直到下一個項目將其推出為止。
ReplaySubject
的語義是對發出的項目數進行緩沖,直到緩沖區大小為止,並在訂閱時將它們全部發送給訂閱者。 我們可以使用緩沖區大小初始化ReplaySubject
。 緩沖區大小為1會使它的行為類似於BehaviorSubject
(但我們不需要使用值對其進行初始化)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.