【问题标题】:How to combine multiple rxjs observables with a single subscription?如何将多个 rxjs 可观察对象与单个订阅结合起来?
【发布时间】:2022-01-07 14:18:54
【问题描述】:

我有一个 observable 来获取 users,然后我想通过 API 调用为每个用户获取 roles,然后将所有数据组合到一个对象数组中进行显示。

我已经到了这一点,但我认为必须有一种方法可以让我将角色调用与流中的用户结合起来,而不必订阅然后 combineLatest:

  this.getAllUsersParams$
    .pipe(
      switchMap(params => this.userFacadeService.sysadminGetAllUsers(params)),
      map(allUsers => {
        const rolesCalls: Observable<UserRoles[]>[] = [];

        allUsers.users.forEach(user => {
          rolesCalls.push(this.userFacadeService.getUserRoles(user.id));
        });

        return { allUsers, rolesCalls };
      })
    )
    .subscribe(data => {
      combineLatest(data.rolesCalls)
        .pipe(
          map(userRoles => {
            const userListVM: UserListVM[] = data.allUsers.users.map((user, i) => {
              return {
                ...user,
                roles: userRoles[i],
              };
            });
            return { userListVM, total: data.allUsers.total };
          })
        )
        .subscribe(data => {
          // consume data
        });
    })

【问题讨论】:

    标签: javascript angular rxjs observable


    【解决方案1】:

    你在寻找这样的东西吗?

    this.getAllUsersParams$
      .pipe(
        switchMap(params => this.userFacadeService.sysadminGetAllUsers(params)),
        switchMap(allUsers => combineLatest(
          allUsers.users.map(user => combineLatest([
            of(user),
            this.userFacadeService.getUserRoles(user.id),      
          ])
        )),
        map((result): { total: number, userListVM: UserListVM[] } => ({
          total: result.length,
          userListVM: result.map(user => ({
            ...user[0],
            roles: user[1]
          }))
        }))
      )
      .subscribe(data => {
        ...
      });
    

    它将每个用户与其角色配对,然后您可以将数据操作为您想要的结构。

    【讨论】:

    • 是的,这更符合我想象中应该做的事情。在 subscribe 中操作数据会比使用 map 操作符更好吗?
    • 如果您愿意,可以使用地图运算符!
    • @SamWillis 看到我的更新。我添加了地图功能来模仿你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2018-07-28
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多