operadores rxjs, ¿cómo devolver datos anidados en un solo objeto?
Nov 30 2020
No puedo encontrar una forma limpia de obtener datos anidados de la forma rxjs.
Hay una devolución observable de todos los usuarios y una devolución observable de todas las publicaciones dada una identificación de usuario.
getUsers(): Observable<User[]>
y
getPosts(id: string): Observable<[]>
¿Cómo devolvería una lista de usuarios con sus publicaciones?
Por el momento preparo los datos usando 2 suscripciones anidadas.
nestedFetch() {
this.service.getUsers()
.subscribe(
res => {
res.forEach((user) => {
this.service.getPosts(user.Id).subscribe(
posts => {
user.posts = posts;
this.users.push(user);
},
err => console.log('something went wrong: ' + err)
)
})
},
err => console.log('something went wrong: ' + err)
);
}
Preferiría usar operadores como esto. Pero, ¿cómo puedo devolver a los usuarios, incluidas sus publicaciones?
nestedFetch() {
this.service.getUsers().pipe(
map(users => users.map(u => this.membership.getPosts(u.id))),
mergeMap(posts => forkJoin(posts))
).subscribe(
res => this.posts = posts, //returns only posts but not users
err => console.log('something went wrong: ' + err)
)
}
Respuestas
2 MoxxiManagarm Nov 30 2020 at 19:19
Una tubería interior ayuda a extender al usuario por sus publicaciones.
this.service.getUsers().pipe(
switchMap(users => {
const postsRequests$ = this.users.map(user => this.service.getPosts(user.id).pipe( // example for a error catch which would lead to an empty array not breaking the forkJoin // catchError(err => of([])), map(posts => ({ ...user, posts })), )); return forkJoin(postsRequests$);
}),
).subscribe(/* ... */);