我正在使用angularfire,我需要在key上“连接”两个节点。这是我的方法:
mergetest(userkey){
return this.db.list(`userOwnHangouts/${userkey}`)
.mergeMap((hangouts) => {
console.log('the merge hangout: ', hangouts.$key) //undefined
return this.db.list(`hangoutInterestedUsers/${hangouts.$key}`)
})
.subscribe(x => console.log('subscribe: ', x))
}正如您所看到的,当我尝试获取$key时,它是未定义的。不过,如果我只记录hangouts,我确实会得到一个对象数组。
如何使用mergeMap返回一个既包含第一个查询的结果又包含第二个查询的结果的可观察对象?在这种情况下,hangouts本身和属于它们的用户呢?
在控制台中,我得到:

下面是我想加入的两个节点:


@Maximus这是我得到的结果,我能得到一个数组中的所有对象,然后用ngFor吗?
发布于 2017-08-06 14:13:21
这在一般情况下应该是有效的:
return this.db.list(`userOwnHangouts/${userkey}`)
// flattening the array returned by `list()`
.mergeMap((o) => {
return o;
})
.mergeMap((o) => {
return this.db.list(`hangoutInterestedUsers/${o['$key']}`).map((users) => {
return {...o, users: users};
});
})
.reduce((acc, v) => {
acc.push(v);
return acc;
}, [])
.subscribe(x => console.log('subscribe: ', x))
}编辑:
但是因为两个this.db.list都不能完成,所以我们不能在这里使用reduce。同样,由于同样的原因,forkJoin也不会工作。所以我们要做的就是combineLatest
this.db.list(`userOwnHangouts/${userkey}`)
.switchMap((list: any[]) => Rx.Observable.combineLatest(
list.map((item: any) => this.db.list(`hangoutInterestedUsers/${item['$key']}`)),
(...results: any[][]) => {
list.forEach((item: any, index: number) => {
item["users"] = results[index];
});
return list;
}
))
.subscribe(x => console.log('subscribe: ', x))https://stackoverflow.com/questions/45529059
复制相似问题