RxJS combineLatest算子疑问:为何调整Observable间隔后无0/0初始输出?
RxJS combineLatest 未输出初始值的原因解析
要搞懂这个问题,核心是记住combineLatest的触发规则:
只有当所有源 Observable 都至少发射过一次值之后,combineLatest 才会开始发射组合结果;之后每当任意一个源 Observable 发射新值,就用所有源的最新值组合成新结果发射。
第一段代码的时间线分析
let intObs1$ = interval(1000).pipe(take(3)); // 0(1000ms)、1(2000ms)、2(3000ms) let intObs2$ = interval(500).pipe(take(3)); // 0(500ms)、1(1000ms)、2(1500ms) combineLatest([intObs1$, intObs2$]).subscribe(([v1, v2]) => console.log(v1, v2));
- 500ms:intObs2$ 发射第一个值
0,但 intObs1$ 还没发射任何值,combineLatest 不触发。 - 1000ms:intObs1$ 发射第一个值
0,此时两个 Observable 都有了初始值,combineLatest 用两者的最新值(0和0)组合发射,输出0 0;紧接着 intObs2$ 发射第二个值1,combineLatest 用 intObs1$ 的最新值0和 intObs2$ 的新值1组合,输出0 1。 - 后续的发射都是基于任意源的新值+其他源的最新值,对应输出的剩余行。
第二段代码的时间线分析
let intObs1$ = interval(500).pipe(take(3)); // 0(500ms)、1(1000ms)、2(1500ms) let intObs2$ = interval(1000).pipe(take(3));// 0(1000ms)、1(2000ms)、2(3000ms) combineLatest([intObs1$, intObs2$]).subscribe(([v1, v2]) => console.log(v1, v2));
- 500ms:intObs1$ 发射第一个值
0,但 intObs2$ 还没发射任何值,combineLatest 不触发。 - 1000ms:intObs2$ 终于发射第一个值
0,但此时 intObs1$ 已经发射了第二个值1(因为500ms间隔,1000ms是第二个值)。此时 combineLatest 拿到的是两个源的最新值:intObs1$ 的1和 intObs2$ 的0,所以第一个输出是1 0,自然不会出现0 0。 - 后续的发射逻辑和第一段一致,对应剩余输出行。
总结来说,0 0 没出现的本质是:当最后一个源 Observable(intObs2$)发出第一个值时,第一个源(intObs1$)已经更新到了下一个值,combineLatest 只会组合所有源的当前最新值,不会回溯之前的旧值。
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

