在发出两个observable的第一个值之后,Zip不会发出值

时间:2017-07-13 07:31:30

标签: angular typescript rxjs observable behaviorsubject

我正在尝试组合两个observable,其中一个是路由参数,另一个是自定义的。

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

我读了这个

  

“zip操作员将订阅所有内部可观察者,等待   每个都发出一个值。一旦发生这种情况,所有的值都与   将发出相应的指数。这将持续至少   一个内在的观察者完成了。“

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

以下是我的一些代码:

我的服务中的发射器:

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

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

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

在完成所有计算后调用:

this.dataEmitter.next(this.calculatedData);

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

你的拉链工作正常。 null是一个值。您可以使用dataEmitter.filter(val => !isNullOrUndefined(val))来过滤空值和未定义的值。