You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJS新share操作符为何保持Observable热态?预期不符问题咨询

问题原因解析

核心问题出在of(4)的特性和share操作符的配置组合上:

  • of(4)的本质:它是一个订阅后立即同步发出值并完成的Observable,不会持续发射数据。
  • share的配置逻辑:
    • resetOnComplete: false:当源Observable(这里就是of(4))完成后,即使引用计数降到0,也不会销毁内部创建的ReplaySubject,会保留它的缓存。
    • resetOnRefCountZero: true:这个配置只有在源Observable还未完成的情况下,才会在引用计数归零后重置内部Subject。但你的场景里,源在第一次订阅时就已经完成了,所以这个配置根本不会触发。

具体执行流程:

  1. 第一次订阅test时,share创建ReplaySubject,订阅源of(4),此时tap打印日志,4被发送到ReplaySubject并缓存,随后源Observable立即完成。
  2. 2秒后取消订阅,引用计数归零,但因为源已经完成且resetOnComplete: false,内部的ReplaySubject被保留,没有被销毁重置。
  3. 4秒后再次订阅test,share发现已有可用的ReplaySubject,直接复用它,不会重新订阅源Observable,所以tap的日志不会再打印,直接输出缓存的4。

如果要实现你预期的“日志打印两次”的效果,只需把resetOnComplete设为true,这样当源完成后,引用计数归零就会重置内部Subject,下次订阅会重新创建Subject并订阅源。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:03:15