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

时间:2020-12-23 12:24:09

标签: angular rxjs angular2-observables rxjs-observables

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

def binary_search(A, B, n):
    matched_list = []

    for i in B:
        low, high = 0, n - 1
        while low <= high:
            middle = (high + low) // 2
            if i > A[middle]:
                low = middle + 1
            elif i < A[middle]:
                high = middle - 1
            else:
                matched_list.append(middle)
                break

        if low > high:
            matched_list.append(-1)

    return matched_list

看一下 userObject:

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

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

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

虽然它有效,但我真的很想避免订阅中的订阅,我曾尝试使用 this.teamService.getTeam(id) .pipe( tap(team => { team.teamMembers.forEach((eachUser) => {this.userService.updateUser(eachUser).subscribe()}) }) ) .subscribe() 执行此操作,但它似乎没有在 switchMap 运算符中运行代码。这是我试过但没有用的代码:

switchMap

2 个答案:

答案 0 :(得分:1)

尝试以下操作

    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()。

答案 1 :(得分:1)

您可以将 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();