RxJS中withLatestFrom忽略BehaviorSubject初始值问题排查
BehaviorSubject初始值被忽略的原因分析
这是withLatestFrom操作符的特性导致的,核心逻辑如下:
withLatestFrom的工作机制是:只有源Observable(此处为frameRateSubject)发出新值时,才会尝试获取第二个Observable(loadedMetadata$)的最新值,两者组合后才会输出结果。- 但这个操作符有个关键前提:第二个Observable必须已经至少发出过一次值,否则即便源Observable发出值,
withLatestFrom也不会产生任何输出。
对应你的代码场景:
frameRateSubject作为BehaviorSubject,订阅时会立即发出初始值24,但此时loadedMetadata$(绑定了video的loadedmetadata事件)还未触发,没有任何可用值。- 所以
withLatestFrom无法完成组合,初始值24的推送被直接过滤掉,tap里自然接收不到。 - 10秒后调用
frameRateSubject.next(20)时,若此时video的loadedmetadata事件已经触发(loadedMetadata$已有值),withLatestFrom就能拿到对应的事件值,组合后输出20,因此能被tap捕获。
注释掉withLatestFrom后,frameRateSubject的所有值都会直接推送,所以能接收到初始值24和后续的20。
内容的提问来源于stack exchange,提问作者Timothy
相关产品推荐
相关产品推荐

