【发布时间】:2017-07-28 06:43:42
【问题描述】:
我有一个消息 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构造函数
消息组件构造函数
调用MessageService观察者
Angular 正在开发模式下运行。
当解析器出现错误时:
调用MessageService构造函数
GET http://localhost:7777/api/jobs401(未授权)
发生应用错误:授权失败,不记名令牌无效。
this.messagesObserver 未初始化 undefined
消息组件构造函数
调用MessageService观察者
Angular 正在开发模式下运行。
所以我需要一种方法让new Observable(observer) 立即创建观察者,这样它就不会未定义,并且在组件准备好订阅时不会丢失和发出消息。
【问题讨论】:
-
也许您正在寻找
ReplaySubject? github.com/Reactive-Extensions/RxJS/blob/master/doc/api/…
标签: javascript angular rxjs observable