使用没有内部订阅的外部数组展平嵌套的 Observables (RxJS)
Flatten nested Observables with outer array without inner subscribe (RxJS)
给定以下执行异步 HTTP 调用的 TypeScript 函数:
public retrieveAllMembersIdsFromGroup(groupId: string): Observable<string[]>
public retrieveMember(memberId: string): Observable<Member>
如何将其合并到一个函数中以获取所有成员 (Observable)?
public retieveAllMembersFromGroup(groupId: string): Observable<Member[]>
例如我想要这样的东西:
public retieveAllMembersFromGroup(groupId: string): Observable<Member[]> {
return this.retrieveAllMembersIdsFromGroup(groupId).pipe(
map((membersIds: string[]) => {
//some magic here to call this.retrieveMember(memberId)
return //Observable<Member[]>;
})
);
}
如果可能,我不想订阅 retrieveAllMembersIdsFromGroup,这样就不必手动处理 ID。
什么是最好的解决方案?
我不完全明白你在寻找什么魔法,但也许这对你有用?
public retrieveAllMembersFromGroup(groupId: string): Observable<Member[]> {
return this.retrieveAllMemberIdsFromGroup(groupId).pipe(
concatMap((memberId: string) => {
return this.retrieveMember(memberId);
})
);
}
请注意,我还更改了一些名称,因为它们拼写错误或语法怪异。
以下解决方案适用于我:
public retrieveAllMembersFromGroup(groupId: string): Observable<Member[]> {
return from(this.retrieveAllMemberIdsFromGroup(groupId)).pipe(
mergeMap((membersIds: string[]) => {
const members$: Observable<Member>[] = [];
membersIds.forEach((memberId: string) => {
members$.push(this.retrieveMember(memberId));
});
return combineLatest(members$);
})
);
}
给定以下执行异步 HTTP 调用的 TypeScript 函数:
public retrieveAllMembersIdsFromGroup(groupId: string): Observable<string[]>
public retrieveMember(memberId: string): Observable<Member>
如何将其合并到一个函数中以获取所有成员 (Observable)?
public retieveAllMembersFromGroup(groupId: string): Observable<Member[]>
例如我想要这样的东西:
public retieveAllMembersFromGroup(groupId: string): Observable<Member[]> {
return this.retrieveAllMembersIdsFromGroup(groupId).pipe(
map((membersIds: string[]) => {
//some magic here to call this.retrieveMember(memberId)
return //Observable<Member[]>;
})
);
}
如果可能,我不想订阅 retrieveAllMembersIdsFromGroup,这样就不必手动处理 ID。 什么是最好的解决方案?
我不完全明白你在寻找什么魔法,但也许这对你有用?
public retrieveAllMembersFromGroup(groupId: string): Observable<Member[]> {
return this.retrieveAllMemberIdsFromGroup(groupId).pipe(
concatMap((memberId: string) => {
return this.retrieveMember(memberId);
})
);
}
请注意,我还更改了一些名称,因为它们拼写错误或语法怪异。
以下解决方案适用于我:
public retrieveAllMembersFromGroup(groupId: string): Observable<Member[]> {
return from(this.retrieveAllMemberIdsFromGroup(groupId)).pipe(
mergeMap((membersIds: string[]) => {
const members$: Observable<Member>[] = [];
membersIds.forEach((memberId: string) => {
members$.push(this.retrieveMember(memberId));
});
return combineLatest(members$);
})
);
}