javascript - 立即创建 Observable 并排队发出直到订阅

标签 javascript angular rxjs 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]);
}

正常操作日志:

Navigated to http://localhost:8090/

MessageService constructor called

messaging component constructor

MessageService observer called

Angular is running in the development mode.

当解析器出现错误时:

Navigated to http://localhost:8090/jobs

MessageService constructor called

GET http://localhost:7777/api/jobs 401 (Unauthorized)

App error occurred: Authorization failure, invalid bearer token.

this.messagesObserver is not initialised undefined

messaging component constructor

MessageService observer called

Angular is running in the development mode.

所以我需要一种方法让 new Observable(observer) 立即创建观察者,这样它就不是未定义的,并且当组件准备订阅时消息不会丢失和发出.

最佳答案

您需要创建一个BehaviorSubject ,

Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.

您还可以使用ReplaySubject ,如果您想缓冲所有响应。

希望这有帮助!!

关于javascript - 立即创建 Observable 并排队发出直到订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658787/

相关文章:

angular - 在 Angular 方法中返回类值

Angular 4访问IIS中 Assets 下的json文件

行为类似于 withLatestFrom 但等待第二个流的值的 RxJs 运算符

javascript - 如果表单组中的任何一个有效,则删除表单中必需的所有属性

javascript - Meteor(JavaScript 应用平台)|将数据添加到用户帐户

javascript - Webrtc 和 socket.io : createanswer() always has an error. 为什么?我的代码连接了两个对等点,但只有其中一个知道这一点?

angular - 将对象传递到 Angular 9/10 解析器

javascript - RXJS 链可观察值在任意点完成

angular - Response.json() 使用接口(interface)绑定(bind)到单个对象 - RxJs/Observable 失败

javascript - 如何让函数每5秒执行一次?