Wie können verschachtelte Daten in einem einzelnen Objekt zurückgegeben werden?
Nov 30 2020
Ich kann keinen sauberen Weg finden, um verschachtelte Daten auf rxjs-Weise abzurufen.
Es gibt eine beobachtbare Rückgabe aller Benutzer und eine beobachtbare Rückgabe aller Beiträge mit einer Benutzer-ID.
getUsers(): Observable<User[]>
und
getPosts(id: string): Observable<[]>
Wie würde ich eine Liste der Benutzer einschließlich ihrer Beiträge zurückgeben?
Im Moment bereite ich die Daten mit 2 verschachtelten Abonnements vor.
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)
);
}
Ich würde lieber solche Operatoren verwenden. Aber wie kann ich Benutzer einschließlich ihrer Beiträge zurückgeben?
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)
)
}
Antworten
2 MoxxiManagarm Nov 30 2020 at 19:19
Ein Innenrohr hilft, den Benutzer um seine Beiträge zu erweitern.
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(/* ... */);