RXJS操作符combineLatestAll工作原理疑问:附代码与输出示例
combineLatestAll 运行逻辑拆解
核心前置知识
of是冷、同步 Observable:只有被订阅时才会发射值,且所有值会在订阅瞬间同步全部发射完成,无延迟。combineLatestAll是高阶 Observable 操作符,运行规则如下:- 收集上游吐出的所有内部 Observable,直到上游 Observable 完成
- 按顺序订阅所有收集到的内部 Observable
- 等所有内部 Observable 都至少发射过1个值后,任意一个内部 Observable 发射新值,就将所有内部 Observable 的最新值按上游吐出的顺序拼接为数组,作为结果输出
代码执行分步推演
你给出的代码中,外层 of(1,2,3) 是同步流,会瞬间吐出1、2、3三个值,生成三个内部 Observable(记为 Obs1 对应v1=1、Obs2对应v1=2、Obs3对应v1=3)后立刻完成。此时 combineLatestAll 拿到全部三个内部 Observable,开始按顺序订阅:
- 订阅 Obs1:Obs1 同步发射
[1,100]→[1,101]→[1,102]→[1,103]→[1,104]后完成,Obs1 最新值停留在[1,104] - 订阅 Obs2:Obs2 同步发射
[2,100]→[2,101]→[2,102]→[2,103]→[2,104]后完成,Obs2 最新值停留在[2,104] - 订阅 Obs3:Obs3 开始同步发射值,此时三个内部 Observable 都已存在有效最新值,每发射一个值就触发一次结果输出:
- 发射
[3,100]→ 输出[[1,104],[2,104],[3,100]] - 发射
[3,101]→ 输出[[1,104],[2,104],[3,101]] - 发射
[3,102]→ 输出[[1,104],[2,104],[3,102]] - 发射
[3,103]→ 输出[[1,104],[2,104],[3,103]] - 发射
[3,104]→ 输出[[1,104],[2,104],[3,104]]
- 发射
逻辑验证
如果给内部的 of 加上延迟,改造成异步流,你会看到前两个 Observable 的中间值也会参与组合,输出结果会和现在完全不同,就能更直观感受到 combineLatestAll 的组合逻辑。
内容的提问来源于stack exchange,提问作者devguy
相关产品推荐
相关产品推荐

