在 Observables 的菱形模式中,`withLatestFrom` 保证了什么?
In a diamond pattern of Observables, what does `withLatestFrom` guarantee?
RxJS 5 中 Observable 运算符 withLatestFrom
的文档似乎不清楚相互依赖的可观察对象(即可观察对象的菱形模式)的行为方式。
我的问题与非常相似。简短说明如下:
我有三个 Observable A、X 和 Y。它们的配置如下:
- X 取决于 A。
- Y 通过
withLatestFrom
方法依赖于 A 和 X。
在代码中,这看起来像:
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>
RxJS 5 中 Observable 运算符 withLatestFrom
的文档似乎不清楚相互依赖的可观察对象(即可观察对象的菱形模式)的行为方式。
我的问题与
我有三个 Observable A、X 和 Y。它们的配置如下:
- X 取决于 A。
- Y 通过
withLatestFrom
方法依赖于 A 和 X。
在代码中,这看起来像:
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>