как последовательно сделать подписку на Observable? (RxJS) - PullRequest
0 голосов
/ 04 октября 2019

Я столкнулся с проблемой: мне нужно сначала получить данные комментариев (для пользователей), во-вторых получить данные пользователей и сопоставить комментарии и пользователей:

Структура данных:

comment:
id,
date,
userId,
message

--------

user:
id,
name

Я хочу получать комментарии и добавлять имя пользователя для каждого получаемого комментария. Т.е. я хочу, чтобы комментарий содержал имя пользователя:

comment:
id,
date,
userId,
message,
userName

Я прочитал документацию по rxjs, но из-за обилия различных операторов я не знаю, что мне подходит.

Iпопробуйте

//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 () тогда получите желаемый результат.

Извините, если это очевидные вещи. Я новичок в RxJS

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Одним из способов может быть следующее

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
  })
)
0 голосов
/ 04 октября 2019

В этой строке

return this.userService.searchUsers({ id: ids });

вы можете объединить его с comments (который у вас уже есть):

return forkJoin(of(comments), this.userService.searchUsers({ id: ids }));
...