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
相关产品推荐
相关产品推荐

