我找不到以rxjs方式获取嵌套数据的干净方法。
有一个 Observable 到的返回所有用户,一个 Observable 到的返回给定用户ID的所有帖子。
getUsers(): Observable<User[]>
和
getPosts(id: string): Observable<[]>
我如何返回用户列表,包括他们的帖子?
目前,我使用2个嵌套订阅来准备数据。
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)
);
}
我宁愿使用像这样的运算符。但是我该如何返回包括他们帖子在内的用户?
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)
)
}
内管有助于通过用户的帖子来扩展用户。
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(/* ... */);
订阅会捕获内部管道引发的错误吗?
@FH Pipe只是将一个或多个咖喱函数链接在一起(自由点样式)。因此,您需要知道的是
forkJoin()
内部可观察错误时是否发生错误。答案是肯定的。如果发生任何内部可观察到的错误,则永远不会从那里得到结果forkJoin
,仅仅是该错误。您还可以使用rxjs
catchError
运算符处理错误,我扩展了答案