0

从今天早上开始,我正在尝试解决一个非常令人头疼的问题。

我将首先解释(非常简单的)情况。

我创建了组,它由一个标题和一个成员数组组成,仅由它们的 id 字符串给出。

现在,我想显示这些组。是不是很简单?但是,我当然不想只显示成员的 ID,而是显示组用户的完整信息(例如基本上他们的名字......)。

所以,我当然有一个获取所有组的服务,以及另一个通过 ID 获取用户的服务。

在 React 中,因为我没有使用 rxjs,所以我不会有任何问题;async/awaits 和 Promise.all 可以解决问题。

但是在这里,在渲染之前尝试获取完整信息(调用 2 个服务)时会出现几个问题,例如:1.我想获取组 2.对其进行迭代 3.对组成员进行迭代 4.最终为每个成员获取它的标识。因此,例如,每个组都可以有一个 groupcompleteusers 数组,每次我从 id 获取有关用户的信息时,我都会填写它...

所以我尝试了以下方法:
- 首先我尝试使用 async/await、Promises,但由于我正在调用返回 Observables 的服务,所以我有点迷失了。
- 然后我尝试嵌套订阅。但是,我完全无法正确编写它,因为我不仅要迭代组,还要迭代 group.members (在嵌套订阅时不存在,因为组当时是一个 Observable。 ..)

因此,使用 angular 7/rxjs 6,我尝试了以下操作:

getGroups(){
this.groupsService.getGroups().pipe(
  flatMap(group => 
    {
      for(let member of group.members){
        this.userService.getUser(member);
      }
    }
    )
).subscribe(u => this.groups = u)


}

当然,它不起作用,尤其是 group.members 当时不存在......

所以我有点卡住了。

也许有些人有线索?

谢谢!

4

1 回答 1

0

flatMap函数希望您返回一个Observable,因此您可以执行以下操作:

import { forkJoin } from 'rxjs';

getGroups(){
  this.groupsService.getGroups().pipe(
    flatMap((groups: any[]) => {
      let members = groups.map(grp => grp.members)
                          .reduce((res, arr) => res.concat(arr), []);
                          .map(member => this.userService.getUser(member))
      return forkJoin(members);
    })
  )
).subscribe(u => this.groups = u)

在这里,我们使用mapon 数组将其从数组转换为members数组Observable。然后我们使用forkJoin将数组加入Observable到单个Observable中,并将其返回给flatMap

于 2018-11-18T14:12:38.117 回答