首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为订阅值中的每个值调用订阅的方法,而不会回调地狱

为订阅值中的每个值调用订阅的方法,而不会回调地狱
EN

Stack Overflow用户
提问于 2020-12-23 20:24:10
回答 2查看 27关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
复制
team: {
    teamName: 'blueberries',
    teamMembers: [{UserObject}, {UserObject}]
}

下面我们来看一下userObject:

代码语言:javascript
代码运行次数:0
运行
复制
user: {
    uid: 1,
    uname: 'DPR'
}

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

代码语言:javascript
代码运行次数:0
运行
复制
this.teamService.getTeam(id)
   .pipe(
       tap(team => {
          team.teamMembers.forEach((eachUser) => {this.userService.updateUser(eachUser).subscribe()})
       })
   )
   .subscribe()

虽然它可以工作,但我真的希望避免订阅中的订阅我已经尝试过用switchMap来做这件事,但它似乎不能在switchMap操作符中运行代码。下面是我尝试过的代码,但不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
this.teamService.getTeam(id)
   .pipe(
       tap(team => {
          team.teamMembers.forEach((eachUser) => 
          switchMap(() => {return this.userService.update(eachUser)})
       })
   )
   .subscribe()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-23 20:41:18

尝试下面这样的方法

代码语言:javascript
代码运行次数:0
运行
复制
    this.teamService
      .getTeam(id)
      .pipe(switchMap((team) => this.updateMembers(team)))
      .subscribe();
代码语言:javascript
代码运行次数:0
运行
复制
  private updateMembers(team: Team) {
    return forkJoin(
      team.teamMembers.map((member) => this.userService.update(eachUser))
    );
  }

您的代码无法工作的原因是您从未订阅过userService.update()。

票数 1
EN

Stack Overflow用户

发布于 2020-12-23 22:47:08

您可以将team数组映射到userService.updateUser调用数组。然后,您可以使用forkJoin(calls)merge(...calls)concat(...calls)订阅这些呼叫。

它们每个都有不同的行为,这取决于您希望如何订阅您的呼叫,以及您希望如何接收结果。由于您不能从updateUser获得结果,因此mergeforkJoin可能没问题。

它看起来像这样:

代码语言:javascript
代码运行次数:0
运行
复制
this.teamService.getTeam(id).pipe(
  map(team => team.teamMembers.map(user => 
    this.userService.updateUser(user)
  )),
  switchMap(serviceCalls => merge(...serviceCalls))
).subscribe();

您可以像这样组合mapswitchMap

代码语言:javascript
代码运行次数:0
运行
复制
this.teamService.getTeam(id).pipe(
  switchMap(team => merge(...
    team.teamMembers.map(user => 
      this.userService.updateUser(user)
    )
  ))
).subscribe();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65424254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档