如何将可返回集合的可观察值与每个项目的新可观察值结合起来?

时间:2019-07-19 01:48:31

标签: angular rxjs google-cloud-firestore

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

1 个答案:

答案 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))

相关问题