2017-03-07 41 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