angular - rxjs 运算符,如何在单个对象中返回嵌套数据?
问题描述
我找不到以 rxjs 方式获取嵌套数据的干净方式。
有一个可观察的返回所有用户和一个可观察的返回给定用户 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(/* ... */);
推荐阅读
- wordpress - 来自 SantuCommerce 插件的 iframe 打开时 WordPress 主题损坏
- apache-spark - 什么决定了 Spark 中一个操作的映射器和缩减器的数量
- sql - 累积和值 1 遇到 0 SQL 时重置和
- arraylist - 在 JAVA 中 nCopies API 的定义中不变性是什么意思?这个 API 的用例是什么?
- java - 为什么 GMT 和 UTC 时区没有相同的规则
- firebase - Firebase 函数 - 从未捕获的无效引用中获取价值
- exchange-server - 本地交换的 Outlook Web 加载项身份验证失败
- java - 强制开发人员为其添加的所有 UI 元素设置可访问性
- python - 基于行的坐标排序列表
- ios - AVPlayer 无法播放 Live Radio URL