首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >combineLatest不发出最新值

combineLatest不发出最新值
EN

Stack Overflow用户
提问于 2018-04-18 22:56:46
回答 3查看 4.9K关注 0票数 5

我很难理解为什么combineLatest没有返回最新的价值。这个例子有点做作,但至少说明了我的问题。注意,当color正确时,可观察到的combineLatest中的subject.value值返回前一个值。就像color$还没有发射。

代码语言:javascript
运行
复制
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'
});

实际输出

代码语言:javascript
运行
复制
{color: "red"} "red" "red"

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

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

预期输出

代码语言:javascript
运行
复制
{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,我会很感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-19 00:43:31

想象正在发生的事情,而不是言词,也许是有用的:

代码语言:javascript
运行
复制
main$     R--------------------Y------------------------------

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

output    -----[R,R]---------[Y,R]-----[Y,Y]------------------

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

代码语言:javascript
运行
复制
main$     R--------------------Y------------------------------

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

output    -----[R,R]-------------------[Y,Y]------------------
票数 6
EN

Stack Overflow用户

发布于 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()发出最后一行输出。

票数 2
EN

Stack Overflow用户

发布于 2019-03-15 05:27:11

使用Observable.zip而不是combineLatest,它从主题中发出非常接近的值。对我来说就像预期的一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49910220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档