rxjs, bagaimana mengembalikan data bersarang dalam satu objek?

Nov 30 2020

Saya tidak dapat menemukan cara yang bersih untuk mengambil data bersarang dengan cara rxjs.

Ada yang dapat diamati kembali semua pengguna dan yang dapat diamati mengembalikan semua posting diberi id pengguna.

getUsers(): Observable<User[]>

dan

getPosts(id: string): Observable<[]>

Bagaimana cara mengembalikan daftar pengguna termasuk postingan mereka?

Saat ini saya menyiapkan data menggunakan 2 langganan bersarang.

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

Saya lebih suka menggunakan operator seperti ini. Tapi bagaimana saya bisa mengembalikan pengguna termasuk posting mereka?

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

Jawaban

2 MoxxiManagarm Nov 30 2020 at 19:19

Pipa bagian dalam membantu memperluas pengguna dengan posnya.

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