CombineLatest不会发出最新值

cga*_*ian 5 rxjs rxjs5

我很难理解为什么combineLatest不返回最新值。这个例子有些人为,但至少说明了我的问题。请注意,当观察值正确时,color来自combineLatestobservable 的值将返回先前的值subject.value。就像color$没有发出可观察到的。

import { map, distinctUntilChanged, combineLatest } from 'rxjs/operators'
import { Observable } from 'rxjs/observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

const main$ = new BehaviorSubject({color: 'red'});

const color$ = main$.pipe(
  map(state => state.color),
)

main$.pipe(
  combineLatest(color$)
)
.subscribe(([state, color]) => {
  console.log(state, color, main$.value.color);
})

main$.next({
    color: 'yellow'
});
Run Code Online (Sandbox Code Playgroud)

实际产量

{color: "red"} "red" "red"

{color: "yellow"} "red" "yellow"

{color: "yellow"} "yellow" "yellow"
Run Code Online (Sandbox Code Playgroud)

预期产量

{color: "red"} "red" "red"

{color: "yellow"} "yellow" "yellow"  // Notice middle value is yellow

{color: "yellow"} "yellow" "yellow"
Run Code Online (Sandbox Code Playgroud)

https://stackblitz.com/edit/combine-latest-issue

如果有人可以帮助解释发生的事情,并提供解决方法或适当的方式对此进行思考,rxjs我将不胜感激。

siv*_*636 5

可视化正在发生的事情而不是文字可能会有用:

main$     R--------------------Y------------------------------

color$    -------R-----------------------Y---------------------

output    -----[R,R]---------[Y,R]-----[Y,Y]------------------
Run Code Online (Sandbox Code Playgroud)

如果您使用zip而不是combineLatest,则将非常接近您的期望。看下面,如果使用,会发生什么zip

main$     R--------------------Y------------------------------

color$    -------R-----------------------Y---------------------

output    -----[R,R]-------------------[Y,Y]------------------
Run Code Online (Sandbox Code Playgroud)