RxJS中publishReplay+refCount在属性与Getter中的行为差异及原因
三种行为的本质原因解析
情况1:Observable属性 + publishReplay/refCount,仅触发一次请求
- 当你把API请求包装后的Observable赋值给类的静态属性时,这个Observable实例只会被创建一次。
publishReplay(1)会缓存它第一次订阅时的API返回结果,refCount()负责自动管理订阅连接:有订阅时保持连接,无订阅时销毁。 - 每次切换大洲选择,组件模板只是重新订阅这个已存在的Observable实例,此时直接读取缓存的结果,不会发起新请求。
情况2:Getter方法 + publishReplay/refCount,每次选择都触发请求
- Getter方法的特性是每次被调用都会重新执行内部逻辑,也就是每次模板触发变更检测时,都会新创建一个Observable实例。
- 哪怕每个新实例都加了
publishReplay/refCount,但每个实例都是独立的,没有共享之前的缓存,所以每次订阅新的Observable,都会发起新的API请求。
情况3:移除publishReplay/refCount,两种方式都重复请求
- RxJS的普通Observable默认是冷订阅模式:每一次新的订阅,都会从头执行Observable内部的全部逻辑(这里就是发起一次API请求)。
- 不管用属性还是Getter方法,只要没有用
publishReplay/refCount把冷Observable转成可共享的热Observable,每次组件模板订阅(切换大洲引发的变更检测会触发订阅),都会触发新的API请求。
内容的提问来源于stack exchange,提问作者Angular animal
相关产品推荐
相关产品推荐

