如何始终如一地订阅 Observable? (RxJS)
how to consistently do subscribe Observable? (RxJS)
我运行遇到一个问题:
我需要先获取评论数据(针对用户),其次获取用户数据并将评论和用户相关联:
结构数据:
comment:
id,
date,
userId,
message
--------
user:
id,
name
我想获取评论并为每个评论添加用户名。
IE。我想让评论包含用户名:
comment:
id,
date,
userId,
message,
userName
我阅读了 rxjs 的文档,但由于各种运算符的丰富,我不知道哪种适合我。
我试试
//get comments
return this.getMovieComments(movieId).pipe(
//form array ids users by comments
mergeMap(comments => {
const ids = comments.map(c => c.userId);
//get users
return this.userService.searchUsers({ id: ids });
})
).subscribe((users) => { console.log(users) });
它是有效的,但我只是得到列表用户,我不知道如何关联来自 getMovieComments() 和 searchUsers()[= 的数据29=] 然后得到想要的结果。
对不起,如果事情很明显。我是 RxJS 的初学者
在这一行
return this.userService.searchUsers({ id: ids });
您可以将它与 comments
(您已经拥有)结合使用:
return forkJoin(of(comments), this.userService.searchUsers({ id: ids }));
一种方法如下
return this.getMovieComments(movieId).pipe(
concatMap(comments => {
const ids = comments.map(comment => comment.id);
return this.userService.searchUsers({ id: ids }).pipe(
// via this map operation we return both the comments and the users to the next operator in the pipe
map(users => ({users, comments})
)
}),
map(({users, comments}) => {
// here users and comments are 2 arrays and so it is possible to assign the user name to the comment - the exact logic may depend on how the arrays are sorted
})
)
我运行遇到一个问题: 我需要先获取评论数据(针对用户),其次获取用户数据并将评论和用户相关联:
结构数据:
comment:
id,
date,
userId,
message
--------
user:
id,
name
我想获取评论并为每个评论添加用户名。 IE。我想让评论包含用户名:
comment:
id,
date,
userId,
message,
userName
我阅读了 rxjs 的文档,但由于各种运算符的丰富,我不知道哪种适合我。
我试试
//get comments
return this.getMovieComments(movieId).pipe(
//form array ids users by comments
mergeMap(comments => {
const ids = comments.map(c => c.userId);
//get users
return this.userService.searchUsers({ id: ids });
})
).subscribe((users) => { console.log(users) });
它是有效的,但我只是得到列表用户,我不知道如何关联来自 getMovieComments() 和 searchUsers()[= 的数据29=] 然后得到想要的结果。
对不起,如果事情很明显。我是 RxJS 的初学者
在这一行
return this.userService.searchUsers({ id: ids });
您可以将它与 comments
(您已经拥有)结合使用:
return forkJoin(of(comments), this.userService.searchUsers({ id: ids }));
一种方法如下
return this.getMovieComments(movieId).pipe(
concatMap(comments => {
const ids = comments.map(comment => comment.id);
return this.userService.searchUsers({ id: ids }).pipe(
// via this map operation we return both the comments and the users to the next operator in the pipe
map(users => ({users, comments})
)
}),
map(({users, comments}) => {
// here users and comments are 2 arrays and so it is possible to assign the user name to the comment - the exact logic may depend on how the arrays are sorted
})
)