我很难理解为什么combineLatest没有返回最新的价值。这个例子有点做作,但至少说明了我的问题。注意,当color正确时,可观察到的combineLatest中的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,我会很感激。
发布于 2018-04-19 00:43:31
想象正在发生的事情,而不是言词,也许是有用的:
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]------------------发布于 2018-04-18 23:08:06
首先更新main$,它作为更改输入combineLatest(),但由于color$没有发出值,因此不会触发输出。然后color$计算它的新值,发出它,现在combineLatest()有两个可用的值,第一行文本被输出。
然后main$更新为{color: "yellow"},输入到combineLatest()中,combineLatest()从main$获取最新值,从color$获取最新值(仍然是"red" ),并触发{color: "yellow"} "red" "yellow"的新输出。
最后,更新color$并触发combineLatest()发出最后一行输出。
发布于 2019-03-15 05:27:11
使用Observable.zip而不是combineLatest,它从主题中发出非常接近的值。对我来说就像预期的一样。
https://stackoverflow.com/questions/49910220
复制相似问题