我正在使用angularfire,我需要"加入"密钥上有两个节点。 这是我的方法:
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时,它是未定义的。虽然如果我只记录环聊,我会得到一系列对象。
我如何使用mergeMap返回一个包含第一个查询和第二个查询的结果的observable?在这种情况下,环聊本身和属于他们的用户?
@Maximus这是我得到的结果我可以获得数组中的所有对象然后使用ngFor吗? [![在此处输入图像说明] [4]] [4]
答案 0 :(得分:0)
这应该适用于一般情况:
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))