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

RxJS7基于share实现的shareResetOnError操作符toPromise返回undefined问题

问题根因

新旧实现的底层Subject类型不一致,是导致测试失败的核心原因:

  • 旧实现使用AsyncSubject作为多播载体,AsyncSubject的特性是仅在源Observable完成后,向所有订阅者(包括后续新加入的订阅者)发射源最后一次发送的值。所以你第一次订阅触发源执行、完成后,后续2次订阅依然能从AsyncSubject拿到缓存的最终值,测试可以正常通过。
  • RxJS7的share操作符默认使用普通Subject作为多播载体,普通Subject不会缓存之前发送的值,且一旦进入完成状态后,新的订阅者不会收到任何之前的next通知,只会直接收到完成通知。你配置了resetOnComplete: false,源第一次完成后Subject不会被重置,后续调用toPromise/lastValueFrom订阅时,已经处于完成状态的普通Subject没有值可以返回,因此得到undefined。

修复方案

给share操作符显式指定connector参数,使用AsyncSubject即可对齐旧实现的行为,修改后的操作符代码如下:

import { share } from 'rxjs/operators';
import { AsyncSubject } from 'rxjs';

export const shareResetOnError = <T>() => share<T>({
  connector: () => new AsyncSubject<T>(),
  resetOnError: true,
  resetOnComplete: false
});

修改后即可正常通过所有测试。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:04