所以我目前有一个返回团队的订阅,在团队内部有一个存储用户对象的数组。我想为每个用户调用另一个订阅。下面是team对象的视图:
team: {
teamName: 'blueberries',
teamMembers: [{UserObject}, {UserObject}]
}
下面我们来看一下userObject:
user: {
uid: 1,
uname: 'DPR'
}
我目前有一段代码,其中我为团队订阅了一个getRequest,然后点击team 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()
发布于 2020-12-23 12:41:18
尝试下面这样的方法
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()。
发布于 2020-12-23 14:47:08
您可以将team
数组映射到userService.updateUser
调用数组。然后,您可以使用forkJoin(calls)
、merge(...calls)
或concat(...calls)
订阅这些呼叫。
它们每个都有不同的行为,这取决于您希望如何订阅您的呼叫,以及您希望如何接收结果。由于您不能从updateUser
获得结果,因此merge
或forkJoin
可能没问题。
它看起来像这样:
this.teamService.getTeam(id).pipe(
map(team => team.teamMembers.map(user =>
this.userService.updateUser(user)
)),
switchMap(serviceCalls => merge(...serviceCalls))
).subscribe();
您可以像这样组合map
和switchMap
:
this.teamService.getTeam(id).pipe(
switchMap(team => merge(...
team.teamMembers.map(user =>
this.userService.updateUser(user)
)
))
).subscribe();
https://stackoverflow.com/questions/65424254
复制