簡體   English   中英

觀察者訂閱首次加載到組件時未觸發

[英]Observer subscribe not firing on first load to Component

我有一家商店公開asObservable。 視圖對此進行訂閱並顯示數據。 自從將其更改為Singleton服務以來,它一直處於首次加載狀態,當我第一次進入該頁面時,沒有數據顯示,也沒有觸發訂閱事件。 在對數據執行了一些操作之后,該數據導致subject.next被調用,它會更新,視圖也會更新,一切都很好。

我確保這不是爭用條件問題,並且在調用頁面的構造函數時數據已存儲在存儲區中。

事件順序如下(在調試過程中確認):

  1. 數據從服務器加載
  2. 使用正確的數據調用subject.next()
  3. 調用觀察者的組件構造函數

即使存儲中存在訂閱事件,也不會觸發訂閱事件,也不會填充任何數據。 如果然后在列表上執行某種操作,一切都會按預期級聯,則調用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
  });

事件順序如下(在調試過程中確認):

  1. 數據從服務器加載
  2. 使用正確的數據調用subject.next()
  3. 調用觀察者的組件構造函數

這是因為香草Subject沒有緩沖任何內容。 發出一條消息時,如果在那個確切的時間沒有人訂閱,則該消息將永遠消失,也沒有人會收到它。

如果要保留對所有訂戶的最后一條消息的緩沖,則可以使用BehaviorSubjectReplaySubject

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM