2017-03-07 48 views
0

我有一條消息Observable,用於在頁面上顯示通知。我遇到的問題是,在組件初始化之前頁面加載時發生錯誤意味着Observable尚未訂閱,因此在嘗試發出錯誤時未定義。立即創建Observable並排隊直到訂閱

export class MessageService { 
    public messagesSource: Observable<IMessage>; 
    private messagesObserver: any; 

    constructor() { 
     console.log('MessageService constructor called'); 
     this.messagesSource = new Observable(observer => { 
      console.log('MessageService observer called'); 
      this.messagesObserver = observer; 
     }).share(); 
    } 

    public show = (message: IMessage) => { 
     if (this.messagesObserver) { 
      this.messagesObserver.next(message); 
     } else { 
      console.error('this.messagesObserver is not initialised', this.messagesObserver); 
     } 
    } 
} 


export class MessagingComponent { 
    public messages: IMessage[] = []; 

    constructor(private messageService: MessageService) { 
     console.log('messaging component constructor'); 
     this.messageService.messagesSource.subscribe(message => this.setMessage(message)); 
    } 
} 

// and within my HttpService: 
private errorHandler = (error: Response): Observable<any> => { 
    const err: string = error.text() || JSON.stringify(error); 
    console.error('App error occurred:', err); 
    this.messageService.show({ content: err, level: 'danger'}); 
    return Observable.from([null]); 
} 

正常運行日誌:

導航到名爲

消息組件構造

MessageService觀察者http://localhost:8090/

MessageService構造稱爲

Angular正在開發模式下運行。

當有一個解析器錯誤:

導航到名爲

http://localhost:8090/jobs

MessageService構造GET http://localhost:7777/api/jobs發生401(未授權)

應用程序錯誤:授權失敗,無效的持票人令牌。

this.messagesObserver將不會被初始化未定義

消息組件構造

MessageService觀察員呼籲

角是在開發模式下運行。

所以我需要一種方法來有new Observable(observer)立即創建觀察員,以便它不是不確定和信息都不會丟失,發射組件時準備認購。

+1

也許您在尋找'ReplaySubject'? https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/replaysubject.md –

回答

1

你需要創建一個BehaviorSubject

觀察員可以訂閱個體接受最後一次(或 初始)值和所有後續通知。

如果你想緩衝所有的響應,你也可以使用ReplaySubject

希望這有助於!

+0

'BehaviorSubject'自己做了,除非我必須用'null'初始化它。 – BeaverusIV

+0

好吧,在玩過一段時間後,看着'ReplaySubject',它更適合。 – BeaverusIV