【问题标题】:Observable.zip but get first value, don't wait for all valuesObservable.zip 但获得第一个值,不要等待所有值
【发布时间】:2018-07-16 02:36:29
【问题描述】:

说我有这个:

const a = new BehaviorSubject(0);
const b = new BehaviorSubject(0);

Observable.zip(
    a.asObservable(),
    b.asObservable()
)
.subscribe(v => {
    // this will fire with [0,0]
    // but I want it to also fire with [1,0]
});

a.next(1);

如何实现订阅下一个功能中的评论内容? 我相信我需要找到与Observable.zip() 不同的运算符,例如Observable.first()

【问题讨论】:

  • .combineLatest() 怎么样?
  • idk,行吗?
  • 添加答案,我会投票

标签: observable rxjs5 angular2-observables


【解决方案1】:

.zip() 仅在来自observables 的发射是可压缩的时才有效。对于您的情况,因为 0,0 已经压缩,因此只会有一个这样的发射。如果你想要下一次发射,你的b 主题也必须发射一个值:

const a = new BehaviorSubject(0);
const b = new BehaviorSubject(0);

Observable.zip(
    a.asObservable(),
    b.asObservable()
)
    .subscribe(v => {
        // this will fire with [0,0]
        // will fire only if both a and b has emisions. 
        // this also logs [1,1] because there is a b.next(1)
    });

a.next(1);
b.next(1); // this step is crucial

如果您想检测任意数量的Observables 组合的任何变化,则必须使用Observable.combineLatest()

CombineLatest 操作符的行为方式与 Zip 类似,但 Zip 仅在每个已压缩的源 Observables 发射了一个先前解压缩的项目时才会发射项目,而只要任何源 Observables 发射一个项目,CombineLatest 就会发射一个项目(只要因为每个源 Observables 都发出了至少一个项目)。当任何源 Observables 发出一个项目时,CombineLatest 使用您提供的函数组合来自其他每个源 Observables 最近发出的项目,并从该函数发出返回值。

【讨论】:

  • 谢谢,你知道我是否可以使用投影函数而不是将其包装在 Observable.create() 中?
  • @AlexanderMills 编辑了我的答案。至于投影功能,不知道你会怎么做,但通常如果你只是想转换数据,.map().switchMap() 运算符就足够了,不过这真的取决于你的用例。
  • 对不起,@CozyAzure,我对这个问题和我今天问的另一个问题感到困惑,看看这个:stackoverflow.com/questions/48635666/…
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多