我正在尝试解决一个问题,当我有两个可观察对象时,我想将它们合并为单个值在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: 我也尝试了forkJoin。
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;
})
}
使用与上面相同的模板。结果: 数值在模板和控制台中未显示,并且未打印console.log的结果。
Observable.forkJoin([obs1, obs2, ...])
吗? - BradObservable.forkJoin()
应该能满足你的需求。 - martin