在发出两个 observable 的第一个值后,Zip 没有发出值

Posted

技术标签:

【中文标题】在发出两个 observable 的第一个值后,Zip 没有发出值【英文标题】:Zip isn't emitting values after the first values from both observables have been emitted 【发布时间】:2017-12-17 20:30:24 【问题描述】:

我正在尝试组合两个可观察对象,其中一个是路由参数,另一个是自定义参数。

我正在使用zip,因为forkJoin 似乎不起作用。但是拉链表现得很奇怪,因为当我发出我的自定义拉链时,我没有得到那个值。我只得到了第一个空值,它作为默认发射值被赋予我的BehaviorSubject

我读过这个

"zip 操作符会订阅所有内部的 observables,等待 每个发出一个值。一旦发生这种情况,所有值与 将发出相应的索引。这将持续到至少 一个内部 observable 完成。”

这是否意味着在两个可观察对象都发出值之前它不会响应?因为路由参数 observable 只会发出一次,但 dataEmitter 将继续发出值。在这种情况下,正确的运算符是什么?

这是我的一些代码:

为我服务的发射器:

private dataEmitter: BehaviorSubject<any> = new BehaviorSubject<any>(null);

组件订阅,只能从dataEmitter获取null,从不获取this.calculatedData

Observable.zip(this.route.params, this.dataCalculator.dataEmitter$)
  .subscribe(data => console.log(data));

当所有计算都完成后调用:

this.dataEmitter.next(this.calculatedData);

【问题讨论】:

是的,zip 的行为与您问题中引用的描述相同。听起来您正在寻找combineLatest @cartant 是的,这似乎可以解决问题。干杯。 【参考方案1】:

正如@cartant 所指出的,切换到combineLatest 按预期工作:

Observable.combineLatest(this.route.params, this.dataCalculator.dataEmitter$)
  .subscribe(data => console.log(data));

【讨论】:

【参考方案2】:

您的 zip 工作正常。 null 是一个值。您可以使用dataEmitter.filter(val =&gt; !isNullOrUndefined(val)) 过滤空值和未定义值。

【讨论】:

以上是关于在发出两个 observable 的第一个值后,Zip 没有发出值的主要内容,如果未能解决你的问题,请参考以下文章

Observable 在 display 、 ionic app 和 angular fire 从 firestore 获取值后失去价值

Rx Java:Observable 在订阅者请求之前发出项目

RxJs。如果我有两个 observable,如何抛出错误并继续发出值?

如何在Android中压缩两个Observable?

Observable 只发出一个值?

RxSwift:如何让一个 observable 触发另一个?