嵌套可观察对象:将observable添加为可观察对象的属性并展开它

嵌套可观察对象:将observable添加为可观察对象的属性并展开它

问题描述:

我试图创建一个将用户数据作为Observable并使用第一个observable的数据添加/合并数据的函数,然后返回所有这些数据作为一个观察的,我能做到这一点,但不能在嵌套的观察到嵌套可观察对象:将observable添加为可观察对象的属性并展开它

这里返回操作是返回一个可观察与可观察到作为一个属性叫做假期

getAllUsersWithHolidays() { 
    return this.users.map(items => { 
    for (let item of items) { 
    item.holiday = this.af.database.list('Holiday', 
     { 
     query: { 
      orderByChild: 'userIdKey', 
      equalTo: item.$key 
     } 
     } 
    ) 
    } 
    return items; 
}); 
} 

问题的函数当我打电话时尝试拔出假期中存储的数据

this.summary$ = this.UserListService.getUserByEmail().mergeMap(user => { //get the user details to filter by team 
    return this.HolidayService.getAllUserWithHolidays().map(data => { 
    return data 
    .filter(team => team.team === user[0].team) //filters users by team 
    .map(item => { //map over combined data 
     return item.holiday 
     .map(hol => { // Hol is observable, build with property daysTaken 
      return { 
      firstname: item.firstname, 
      surname: item.surname, 
      holiday: hol.reduce((prev, curr) => {prev + curr.daysTaken, 0) //cannot access hol data   
      } 
     });   
    }); 
    }) 
}) 

然后用异步解开

{{summary$ | async | json}} 

当在节日期间观察到的映射,似乎我无法访问数据?也许是因为我没有订阅?

我宁愿没有可观察的性质从getAllUsersWithHolidays回来,我宁愿计算它首先

所以不是该返回的项目,因为这

{user: 'exampleName', holiday:fireBaseListObservable} 

的我会回到它已经计算出

{ user:'exampleName' , holiday: 20 } 

但这样做也躲避我......

getAllUsersWithHolidays() { 
    return this.users.map(items => { 
    for (let item of items) { 
    item.holiday = this.af.database.list('Holiday', 
     { 
     query: { 
      orderByChild: 'userIdKey', 
      equalTo: item.$key 
     } 
     } 
    ).reduce((prev, curr) => prev + curr.daysTaken, 0) 
    } 
    return items; 
}); 
} 

我以为我可以这样做,但这仍然返回一个可观察的,当然我不能订阅这里,并返回任何东西,似乎从来没有工作!

+0

flatMap是你的朋友 –

+0

flatMap是mergeMap只是另一个名字这在下面 –

由于您使用mergeMap从getUsers - > usersWithHolidays中展开嵌套的observables,因此您只需要额外的mergeMap即可为每个用户展开假期。唯一复杂的是你的嵌套观察对象是你的对象的属性。所以我们可以用Observable.from()来处理。

getAllUsersWithHolidays() { 
    return this.users.mergeMap(items => { 
    return Observable 
     .from(items) 
     .mergeMap(item => this.af.database.list(...) 
      .map(holiday => { 
       return { 
        ...item, 
        holiday 
       }; 
      }) 
     ); 
    }); 
} 
+0

我已经转载了这个,angularfire Query并没有给我任何与“假期”相关的东西,但是用一个测试Observable.from [1,2,3]代替它,确实证明它可以工作,所以谢谢。我将不得不明白为什么通过angularfire查询进行映射没有任何作用。 – Mangopop

我认为你有一个可观察的流发射可观察到的流。听起来很可怕,但不用担心,RxJS可以处理这个问题。

顶级可观察流被称为高阶可观察性。正在发射的可观测量被称为内部可观测量。

为了获得从内部可观察量(而不是内部可观测量本身)发出的值,应该使用switchMap。

switchMap比flatMap更友好,因为如果有一个出色的innerObservable,switch map会取消它,而是从最新的内部observable发出。这对于http观察者来说很方便。

flatMap不会取消先前的流,所以你会发现从所有内部observables发出。

+0

正确答案这是一个好点的使用,但现在看来似乎不会是方便,但是否正确的问题。这一切都取决于用例。 –