我有一條消息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正在開發模式下運行。
當有一個解析器錯誤:
導航到名爲
MessageService構造GET http://localhost:7777/api/jobs發生401(未授權)
應用程序錯誤:授權失敗,無效的持票人令牌。
this.messagesObserver將不會被初始化未定義
消息組件構造
MessageService觀察員呼籲
角是在開發模式下運行。
所以我需要一種方法來有new Observable(observer)
立即創建觀察員,以便它不是不確定和信息都不會丟失,發射組件時準備認購。
也許您在尋找'ReplaySubject'? https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/replaysubject.md –