rxjs 연산자, 단일 객체에 중첩 된 데이터를 반환하는 방법은 무엇입니까?

Nov 30 2020

rxjs 방식으로 중첩 된 데이터를 가져 오는 깨끗한 방법을 찾을 수 없습니다.

모든 사용자를 반환하는 Observable과 사용자 ID가 주어진 모든 게시물을 반환하는 Observable이 있습니다.

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)
  )
}

답변

2 MoxxiManagarm Nov 30 2020 at 19:19

내부 파이프는 게시물로 사용자를 확장하는 데 도움이됩니다.

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(/* ... */);