嵌套可观察对象:将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;
});
}
我以为我可以这样做,但这仍然返回一个可观察的,当然我不能订阅这里,并返回任何东西,似乎从来没有工作!
由于您使用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
};
})
);
});
}
我已经转载了这个,angularfire Query并没有给我任何与“假期”相关的东西,但是用一个测试Observable.from [1,2,3]代替它,确实证明它可以工作,所以谢谢。我将不得不明白为什么通过angularfire查询进行映射没有任何作用。 – Mangopop
我认为你有一个可观察的流发射可观察到的流。听起来很可怕,但不用担心,RxJS可以处理这个问题。
顶级可观察流被称为高阶可观察性。正在发射的可观测量被称为内部可观测量。
为了获得从内部可观察量(而不是内部可观测量本身)发出的值,应该使用switchMap。
switchMap比flatMap更友好,因为如果有一个出色的innerObservable,switch map会取消它,而是从最新的内部observable发出。这对于http观察者来说很方便。
flatMap不会取消先前的流,所以你会发现从所有内部observables发出。
正确答案这是一个好点的使用,但现在看来似乎不会是方便,但是否正确的问题。这一切都取决于用例。 –
flatMap是你的朋友 –
flatMap是mergeMap只是另一个名字这在下面 –