当我有两个观测值,我想把它们合并成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/