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

问题描述

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

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

解决方法

尝试以下操作

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...