一种在没有回调地狱的情况下为订阅值中的每个值调用订阅的方法

A way to call a subscription for each value within the subscription value without callback hell

所以我目前有一个订阅,其中有 returns 个团队,在团队内部有一个存储用户对象的数组。我想为这些用户中的每一个调用另一个订阅。 这是团队对象的视图:

team: {
    teamName: 'blueberries',
    teamMembers: [{UserObject}, {UserObject}]
}

下面是 userObject:

user: {
    uid: 1,
    uname: 'DPR'
}

我目前有这段代码,我在其中为团队订阅了一个 getRequest,然后点击团队 Observable 并获取用户数组,然后为每个 运行 订阅。代码如下:

this.teamService.getTeam(id)
   .pipe(
       tap(team => {
          team.teamMembers.forEach((eachUser) => {this.userService.updateUser(eachUser).subscribe()})
       })
   )
   .subscribe()

虽然它有效,但我真的很想避免订阅中的订阅我已经尝试使用 switchMap 但它似乎没有 运行 switchMap 中的代码操作员。这是我试过但没有用的代码:

this.teamService.getTeam(id)
   .pipe(
       tap(team => {
          team.teamMembers.forEach((eachUser) => 
          switchMap(() => {return this.userService.update(eachUser)})
       })
   )
   .subscribe()

尝试如下操作

    this.teamService
      .getTeam(id)
      .pipe(switchMap((team) => this.updateMembers(team)))
      .subscribe();
  private updateMembers(team: Team) {
    return forkJoin(
      team.teamMembers.map((member) => this.userService.update(eachUser))
    );
  }

您的代码不起作用的原因是您从未订阅 userService.update()。

您可以将 team 数组映射到 userService.updateUser 调用数组。 然后您可以使用 forkJoin(calls)merge(...calls)concat(...calls).

订阅这些电话

它们各自有不同的行为,具体取决于您希望如何订阅呼叫以及希望如何接收结果。由于您没有从 updateUser 获得结果,mergeforkJoin 可能没问题。

看起来像这样:

this.teamService.getTeam(id).pipe(
  map(team => team.teamMembers.map(user => 
    this.userService.updateUser(user)
  )),
  switchMap(serviceCalls => merge(...serviceCalls))
).subscribe();

您可以像这样组合 mapswitchMap

this.teamService.getTeam(id).pipe(
  switchMap(team => merge(...
    team.teamMembers.map(user => 
      this.userService.updateUser(user)
    )
  ))
).subscribe();