Angular与RxJS技术疑问:MessagesService构造函数中Observable赋值语句的执行时机
问题解答:构造函数中的
this.messages = this.updates ...执行时机 首先直接给你答案:这行代码是在MessagesService的构造函数执行时就运行了,但它的作用是搭建RxJS的数据流管道,真正处理数据的逻辑(比如scan里的函数)要等到后续调用addMessage时才会触发。
下面给你拆解清楚整个过程:
1. 构造函数执行时发生了什么
当Angular创建MessagesService的实例时,构造函数里的所有代码会按顺序执行:
- 首先初始化了所有的Subject(
newMessages、updates、create等) - 然后执行
this.messages = this.updates...这行:- 它把
updates这个Subject作为数据源,通过scan操作符定义了如何累积消息数组的逻辑,接着用publishReplay(1)和refCount()把这个Observable转换成多播的、能缓存最近值的流。 - 注意:这时候只是搭建好了数据流的管道,
scan里的回调函数还没有被执行,因为updates还没有发出任何数据。
- 它把
- 之后构造函数里的几个
subscribe调用也会执行,比如this.create.subscribe(this.updates),这些订阅是在建立各个流之间的连接,确保后续的事件能在流之间传递。
2. 调用addMessage时发生了什么
当你调用addMessage(message)时,整个数据流才会真正动起来:
addMessage里执行this.newMessages.next(message),把新消息推送到newMessagesSubject。- 因为
this.newMessages.subscribe(this.create),这个新消息会被转发到createSubject。 create流通过map把消息转换成一个操作函数(就是那个接收messages数组并返回concat后新数组的函数),然后把这个操作函数推送到updatesSubject。- 此时
updates有了新值,之前搭建好的scan操作就会触发:它会用当前累积的messages数组,加上刚收到的操作函数,计算出更新后的messages数组。 - 这个更新后的数组会通过
messagesObservable发射出去,所有订阅messages的地方就能拿到最新的消息列表。
简单来说,构造函数里的代码是提前铺好路,而addMessage是触发数据流动的开关。
内容的提问来源于stack exchange,提问作者rejkid
相关产品推荐
相关产品推荐

