如何合并作为另一个observable的属性的observable

时间:2017-01-09 12:48:06

标签: javascript angular firebase firebase-realtime-database rxjs

我有一个假期列表,每个假期都附有一个用户ID。我想将检索到的用户数据合并到每个假日记录中,以便返回单个observable。

我创建了这个功能

getAllHolidaysAndUsers() {

  return this.af.database.list('Holiday').mergeMap(items => {
    for (let item of items) {
      item.user = this.af.database.object(`/User/${item.userIdKey}`);        
    }
    return items;

 });
}

它返回一个像这样的对象

{
  fromDate:'20/12/16',
  toDate:'21/12/16',
  user:fireBaseObservable
}

我想要一个这样的对象

{
  fromDate:'20/12/16',
  toDate:'21/12/16',
  user:Array[1]
}

我正在努力在单个订阅中访问user observable。目前我正在做嵌套订阅,我知道这是一种糟糕的形式。

我设法得到了一个类似的例子

getHolidayInfo() {
  return this.getHolidaysByUserId().mergeMap(hol => {

  return this.UserList.getUserByEmail().map(user => { 
    return {hol:hol.date, user:user[0]}
  });

});

但是因为我必须在第一个例子中循环items它只返回最后一个结果,所以这种技术不起作用

Here's the plunker

1 个答案:

答案 0 :(得分:0)

你可以这样做:

getAllHolidaysAndUsers() {
  return this.holiday
    .switchMap(items => Observable.from(items))
    .flatMap(item => {
        return this.af.database.object(`/User/${item.userIdKey}`)
            .map(user => {
                item.user = user;
                return item;
            });
    })
    .toArray();
}