RxJS新share操作符为何保持Observable热态?预期不符问题咨询
问题原因解析
核心问题出在of(4)的特性和share操作符的配置组合上:
of(4)的本质:它是一个订阅后立即同步发出值并完成的Observable,不会持续发射数据。share的配置逻辑:resetOnComplete: false:当源Observable(这里就是of(4))完成后,即使引用计数降到0,也不会销毁内部创建的ReplaySubject,会保留它的缓存。resetOnRefCountZero: true:这个配置只有在源Observable还未完成的情况下,才会在引用计数归零后重置内部Subject。但你的场景里,源在第一次订阅时就已经完成了,所以这个配置根本不会触发。
具体执行流程:
- 第一次订阅
test时,share创建ReplaySubject,订阅源of(4),此时tap打印日志,4被发送到ReplaySubject并缓存,随后源Observable立即完成。 - 2秒后取消订阅,引用计数归零,但因为源已经完成且
resetOnComplete: false,内部的ReplaySubject被保留,没有被销毁重置。 - 4秒后再次订阅
test,share发现已有可用的ReplaySubject,直接复用它,不会重新订阅源Observable,所以tap的日志不会再打印,直接输出缓存的4。
如果要实现你预期的“日志打印两次”的效果,只需把resetOnComplete设为true,这样当源完成后,引用计数归零就会重置内部Subject,下次订阅会重新创建Subject并订阅源。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

