combineLatest不会发出最新值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了combineLatest不会发出最新值相关的知识,希望对你有一定的参考价值。
我很难绕开为什么combineLatest
没有返回最新值。这个例子有点做作,但至少它说明了我的问题。请注意,当color
正确时,来自combineLatest
observable的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'
});
实际产出
{color: "red"} "red" "red"
{color: "yellow"} "red" "yellow"
{color: "yellow"} "yellow" "yellow"
预期产出
{color: "red"} "red" "red"
{color: "yellow"} "yellow" "yellow" // Notice middle value is yellow
{color: "yellow"} "yellow" "yellow"
https://stackblitz.com/edit/combine-latest-issue
如果有人可以帮助解释最新情况,并提供一种解决方法或正确的方式来考虑在rxjs
,我会很感激。
可视化正在发生的事情而不是单词可能是有用的:
main$ R--------------------Y------------------------------
color$ -------R-----------------------Y---------------------
output -----[R,R]---------[Y,R]-----[Y,Y]------------------
如果你使用zip
而不是combineLatest
,你会更接近你的期望。如果你使用zip
,请看下面会发生什么:
main$ R--------------------Y------------------------------
color$ -------R-----------------------Y---------------------
output -----[R,R]-------------------[Y,Y]------------------
首先更新main$
,它作为变化输入combineLatest()
但不触发输出,因为color$
没有发出值。然后color$
计算它的新值,发出它,现在有两个值可供combineLatest()
使用,第一行文本输出。
然后main$
更新到{color: "yellow"}
,进入combineLatest()
,它取main$
的最新值和color$
的最新值(仍然是"red"
,并触发{color: "yellow"} "red" "yellow"
的新输出。
最后,color$
更新并触发combineLatest()
发出最后一行输出。
使用Observable.zip而不是combineLatest,它会从主题中发出非常接近的值。它按预期对我有用。
以上是关于combineLatest不会发出最新值的主要内容,如果未能解决你的问题,请参考以下文章
触发 CombineLatest 在 Combine 中传播初始值
使用 combineLatest 和 Rxjs 返回 observable 的结果