在 Observables 的菱形模式中,`withLatestFrom` 保证了什么?

In a diamond pattern of Observables, what does `withLatestFrom` guarantee?

RxJS 5 中 Observable 运算符 withLatestFrom 的文档似乎不清楚相互依赖的可观察对象(即可观察对象的菱形模式)的行为方式。

我的问题与非常相似。简短说明如下:

我有三个 Observable A、X 和 Y。它们的配置如下:

在代码中,这看起来像:

let a$ = Rx.Observable.interval(...)

let x$ = a$.map(...)

let y$ = a$.withLatestFrom(x$).subscribe((a, x) => {
    console.log("a = " + a)
    console.log("x = " + x)
})

我的问题是,如果我订阅 y$,我是否能保证获得 x$ 的最新值?

根据上面链接的问题,我的理解是这是一个硬性保证:每当 a$ 上有事件时,将首先评估 x$,然后 y$将使用 x$ 的新值进行评估。但是,我觉得 RxJS 文档在这件事上不清楚。

withLatestFrom 是否符合我的预期?

使用默认(立即)调度程序,它的工作方式与您预期的一样:

const a$ = Rx.Observable.interval(1000)

const x$ = a$.map(x => x + 1)

const sub = a$.withLatestFrom(x$).take(3).subscribe(([a, x]) => {
  console.log("a = " + a)
  console.log("x = " + x)
})
<script src="https://unpkg.com/rxjs@5.5.2/bundles/Rx.min.js"></script>

但是,如果 x$ 在不同的调度程序上,您 运行 进入 "strange" 行为(注意第一个值出现需要 2 秒,0 被跳过) .

编辑:有趣的是,rxjs "forgives" 小差异并结合了 a = 2 之后的正确值(但我不会依赖这种效果)

const a$ = Rx.Observable.interval(1000)

const x$ = a$.map(x => x + 1).delay(1)

const sub = a$.withLatestFrom(x$).take(3).subscribe(([a, x]) => {
  console.log("a = " + a)
  console.log("x = " + x)
})
<script src="https://unpkg.com/rxjs@5.5.2/bundles/Rx.min.js"></script>