我具有以下功能
getParticipations(
meetingId: string
): Observable<Participation[]> {
return this.meetingCollection
.doc(meetingId)
.collection<ParticipationDto>('participations')
.snapshotChanges()
.pipe(
map(actions =>
actions.map(m => {
const participationDto = m.payload.doc.data() as ParticipationDto;
const id = m.payload.doc.id;
return new Participation(id, participationDto.vart, null);
})
)
);
}
在participationDto
中有一个文档引用,我想获取该文档,以便返回带有引用文档映射的对象(参与)。
类似
getParticipations(
meetingId: string
): Observable<Participation[]> {
return this.meetingCollection
.doc(meetingId)
.collection<ParticipationDto>('participations')
.snapshotChanges()
.pipe(
map(actions =>
actions.map(m => {
const participationDto = m.payload.doc.data() as ParticipationDto;
const id = m.payload.doc.id;
return this.participantCollection.doc(participationDto.participant.id).get().pipe(
map(pp => {
return new Participation(id, participationDto.vart, pp.data() as Participant);
})
);
})
)
);
}
但是它返回一个Observable<Observable<Participation>[]>
我可能需要合并,映射或类似方法,但是我找不到正确的方法来丰富我的Observable对象映射并保持我的Observable<Participation[]>
感谢帮助
答案 0 :(得分:0)
您可以尝试在Observables的内部列表上使用forkJoin并将外部地图切换到switchMap。
getParticipations(
meetingId: string
): Observable<Participation[]> {
return this.meetingCollection
.doc(meetingId)
.collection<ParticipationDto>('participations')
.snapshotChanges()
.pipe(
switchMap(actions =>
forkJoin(actions.map(m => {
const participationDto = m.payload.doc.data() as ParticipationDto;
const id = m.payload.doc.id;
return this.participantCollection.doc(participationDto.participant.id).get().pipe(
map(pp => {
return new Participation(id, participationDto.vart, pp.data() as Participant);
})
));
})
)
);
}
答案 1 :(得分:0)
您需要使用mergeMap
代替map
类似下面的
getParticipations(
meetingId: string
): Observable<Participation[]> {
return this.meetingCollection
.doc(meetingId)
.collection<ParticipationDto>('participations')
.snapshotChanges()
.pipe(
mergeMap(actions =>
actions.map(m => {
const participationDto = m.payload.doc.data() as ParticipationDto;
const id = m.payload.doc.id;
return this.participantCollection.doc(participationDto.participant.id).get().pipe(
map(pp => {
return new Participation(id, participationDto.vart, pp.data() as Participant);
})
);
})
)
);
}
getParticipations(
meetingId: string
): Observable<Participation[]> {
return this.meetingCollection
.doc(meetingId)
.collection<ParticipationDto>('participations')
.snapshotChanges()
.pipe(
map(actions =>
actions.map(m => {
const participationDto = m.payload.doc.data() as ParticipationDto;
const id = m.payload.doc.id;
return this.participantCollection.doc(participationDto.participant.id).get().pipe(
mergeMap(pp => {
return new Participation(id, participationDto.vart, pp.data() as Participant);
})
);
})
)
);
}
(由于它是复杂且嵌套的,没有提供stackblitz
,因此我无法验证该解决方案,但是如果无法解决,请告诉我删除此答案)