firebase中的当前架构(与此问题相关): -用户 - 派对 -邀请 - 用户身份 -PartyId
目标是将用户“加入”他们所属的邀请中。
有效的丑陋方法是仅嵌套呼叫,但我知道这不是正确的方法。我对RxJS有点陌生,但是觉得必须有一种更简洁的方式来做到这一点。
丑陋的...
const attendees = [];
this.invitationStore.collection$((ref) => ref.where('partyId', '==', partyId)) // Observable<Invitation[]>
.subscribe((invitations: Invitation[]) => {
invitations.map((invite: Invitation) => {
this.userStore.doc$(invite.userId) // Observable<User>
.subscribe((user: User) => {
// combine invite & user
invite.user = user;
attendees.push(invite);
});
});
});
我已经尝试过了,但是它从不记录任何东西
this.getInvitations(partyId).pipe(
map((invites: Invitation[]) => invites.map((invite: Invitation) => invite.userId)),
switchMap((userIds: string[]) => forkJoin(userIds.map((id: string) => this.getUser(id))))
).subscribe((data: any) => console.log(data)); // nothing logs here
getInvitations(partyId: string): Observable<Invitation[]> {
return this.invitationStore.collection$((ref) => ref.where('partyId', '==', partyId));
}
getUser(userId: string): Observable<User> {
return this.userStore.doc$(userId);
}
我正在使用rxjs 6
答案 0 :(得分:0)
您需要为每个邀请mergeMap
forkJoin
的结果:
interface Invitation {
userId: number;
}
interface User {
name: string;
}
interface MappedInvitation {
userId;
user: User;
}
function getInvitations(): Observable<Invitation[]> {
return;
}
function getUser(userId): Observable<User> {
return;
}
function getMappedInvitations(): Observable<MappedInvitation[]> {
return getInvitations().pipe(
mergeMap(invitations => {
return forkJoin(
invitations.map(invitation =>
getUser(invitation.userId).pipe(
map(user => {
const mappedInvitation: MappedInvitation = {
user: user,
userId: invitation.userId
};
return mappedInvitation;
})
)
)
);
})
);
}
如果您的getUser
流从未完成,则可能需要使用combineLatest
。或使用forkJoin pipe(take(1))
。