在可观察范围内使用可观察角度

时间:2018-08-13 09:50:17

标签: angular rxjs angularfire2

我正在制作角度为6的费用管理器Webapp。我的数据库位于firebase上。我正在使用angularfire2库检索和更新数据。

数据库的设计如下

Database design

获取类别的功能是

getCategory(uid:String,categorykey:string):Observable<any> 
   {

return this.afdb.object(`users/${uid}/categories/${categorykey}`)
  .snapshotChanges()
  .pipe(map(c=>({key:c.payload.key,...c.payload.val()})));}

返回可观察到的费用的函数是

getExpensesWithKeys(uid:String):Observable<any>{
return this.afdb.list(users/${uid}/expenses)
.snapshotChanges()
.pipe(
  map(changes =>
  changes.map(c => 
({key:c.payload.key,...c.payload.val()}))
  )
);
 }

在我的组件中,我可以得到

expenses:Expense[];
getExpensesWithKey("userid-123")
.subscribe(expenses=>this.expenses=expenses)

以及任何类别

category:Category;
getCategory("userid-123",expenses[0].category)
.subscribe(category=>this.category=category);

我想创建一个获取支出数组并为每个支出返回类别的可观察对象,我可以将其推入类别数组。 我一直在绞尽脑汁,将这两个可观察到的东西与各种rxjs运算符结合在一起,但无济于事。

非常感谢您的帮助。

编辑: 只是想添加一些我已经尝试过的方法。 我尝试过的一种方法是

this.getExpensesWithKeys("user-123")
.pipe(mergeMap(expenses=>
expenses.map(expense=>
this.getCategory("user-123",expense.category)))).subscribe(console.log);

但是它只是发出一个Observables数组。如何获取类别对象并将其推入数组?

我尝试过的另一种方法

this.rtdbService.getExpensesWithKeys("user-123")
.pipe(map(expenses=>
   expenses.map(expense=>expense.category)))
   .pipe(mergeMap(ids=>
this.rtdbService.getCategory("user-123",ids)))
.subscribe(console.log);

这仅发出类别的键。

我也尝试了以下提供的答案,该答案没有发出任何东西。

预先感谢

2 个答案:

答案 0 :(得分:1)

我终于找到了解决方法

  getExpensewithCategories(uid:String):Observable<any>{
    ;
    let expwithCat$=this.getExpenses(uid).pipe(mergeMap(expenses =>{
      return expenses.map(expense => this.getCategory(uid,expense.category)
      .pipe(map(cat=>
        ({expensekey:expense.key,
          amount:expense.amount,
          date:expense.date,
          expcatkey:expense.category,
          categorykey:cat.key,
          color:cat.color,
          name:cat.name})
        )
      ))
   }
    }));

      return expwithCat$.pipe(mergeAll())
}

答案 1 :(得分:0)

结合awk 'NR==1{a=$0} NR>1{if(length(a)>0){regex="^"a;if($0~regex){print a}}a=$0}' mergeMap链接可观察对象以一次进行多个调用:

forkJoin