RxJs结合可观察物

RxJs结合可观察物

当我有两个观测值,我想把它们合并成angular2和angularFire2中的单个值时,我试图解决这个问题。
假设我有两种类型的银行帐户和事务,传出和传入(这只是我为实践而创建的用例)。我想把它们合计起来,以获得实际的帐户余额。
模板:

....
 <div *ngFor="let account of accounts | async">
    {{ (transactionService.getAccountBalance(account) | async )?.balance }}
 </div
 ....

最后提供数据的服务
    getAccountBalance(account){
    return Observable.zip(
        this.getIncomingTransactionsForAccount(account), // FirebaseListObservable
        this.getOutcomingTransactionsForAccount(account) // FirebaseListObservable
    , (incoming, outcoming) => {
            ....
            let result = {
                account: account.$key,
                balance: someCalculatedNumber
            };
            console.log(result); // result is correct there
            return result;
        }
    )

}
这一个在firebase上导致无限循环(并且不在模板中显示数据)。我也尝试过Observer.merge()和其他一些,但是我觉得我只是在尝试使用绝对错误的方法。
谢谢你的帮助,谢谢!
编辑:
刚刚尝试了另一种解决方案,只使用一个流来计算所有传入事务:
public getAllIncoming(account: IAccount){

    return this.getIncomingTransactionsForAccount(account)
        .scan((x, y) => {
            console.log(x, y);
            return 1;
        }, 0);
}

再次生成无限查询。
编辑2:
我也试过叉接
    public getAccount2Balance(account: IAccount) {

    return Observable.forkJoin([
            this.getIncomingTransactionsForAccount(account),
            this.getOutcomingTransactionsForAccount(account)
        ], (incoming, outcoming) => {
            ...
            let result = {
                account: account.$key,
                balance: someCalculatedNumber
            };
            console.log(result);
            return result;
        })
}

与上述模板相同。结果:
值不显示在template和console.log中,不打印结果

最佳答案

另一个选择是尝试combineLastest。下面假设您的传入和传出帐户呼叫返回一个FirebaseListObservable,并且您正试图将它们合并到一个列表中(accounts)。

return Observable.combineLatest(

  // added .do() to make sure incoming is working
  this.getIncomingTransactionsForAccount(account)
    .do(x => console.log('incoming transactions', x),

  // added .do() to make sure outcoming is working
  this.getOutcomingTransactionsForAccount(account)
    .do(y => console.log('outcoming transactions', y),

  (incoming, outcoming) => {
    // ... do your calculations
    let result = {
      // results
    };
    return result;
  }

);

将临时的.do()副作用添加到每个输入流,以查看它们是否正在被调用并首先返回结果,这可能是好事,特别是因为在前面的示例中似乎没有调用combine块。

关于angular - RxJs结合可观察物,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39692224/

10-10 23:44