Angular2:求和两个Observable <number>值

时间:2017-07-06 16:05:18

标签: angular typescript observable

我有一个带有两个不同函数的服务,它们获取一个由BehaviorSubject监视的数组中的itens数量。

 private itemsInCartSubject: BehaviorSubject<any[]> = new BehaviorSubject([]);
private itemsInCart: any[] = [];

private packetsInCartSubject: BehaviorSubject<Pacote[]> = new BehaviorSubject([]);
private packetsInCart: Pacote[] = [];

 public getTotalItens(): Observable<number> {        

    return this.itemsInCartSubject.map((items: any[]) => {
        return items.reduce((prev, curr: any) => {               
                return prev + Number(curr.qtd);                
        }, 0);
    });
};

   public getTotalPacotes(): Observable<number> {
    return this.packetsInCartSubject.map((items: any[]) => {
        return items.reduce((prev, curr: any) => {               
                return prev + Number(1);                
        }, 0);
    });
};

在我的组件中,我有两种方法来获取这些数字:

 public countItens(): Observable<number> {
    return this.cartService.getTotalItens();
}

public countPacotes(): Observable<number> {
    return this.cartService.getTotalPacotes();
}

在我的html中,我可以显示如下值:

<p>You have {{countItens() | async}} in your cart</p>

它工作正常,当theres是对主题的更改时更新值,但我需要将两个Observable的两个值相加。

我该如何实现?

我试过

this.cartService.getTotalItens()+this.cartService.getTotalPacotes();

但它会生成错误:运算符'+'不能应用于Observable和Observable类型

1 个答案:

答案 0 :(得分:3)

您可以使用combineLatest组合这些Observable,然后返回一个新值,即两者的总和。您可以添加如下新功能:

public getTotal(): Observable<number> {
    return this.countItens()
               .combineLatest(this.countPacotes(), (itens, pacotes) => itens + pacotes);
}

然后在模板中你可以这样使用它:

<p>Total is: {{getTotal() | async}}</p>
Demo of combineLatest