在发出两个 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 => !isNullOrUndefined(val))
过滤空值和未定义值。
【讨论】:
以上是关于在发出两个 observable 的第一个值后,Zip 没有发出值的主要内容,如果未能解决你的问题,请参考以下文章
Observable 在 display 、 ionic app 和 angular fire 从 firestore 获取值后失去价值
Rx Java:Observable 在订阅者请求之前发出项目