一种在没有回调地狱的情况下为订阅值中的每个值调用订阅的方法
A way to call a subscription for each value within the subscription value without callback hell
所以我目前有一个订阅,其中有 returns 个团队,在团队内部有一个存储用户对象的数组。我想为这些用户中的每一个调用另一个订阅。
这是团队对象的视图:
team: {
teamName: 'blueberries',
teamMembers: [{UserObject}, {UserObject}]
}
下面是 userObject:
user: {
uid: 1,
uname: 'DPR'
}
我目前有这段代码,我在其中为团队订阅了一个 getRequest,然后点击团队 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()
尝试如下操作
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
获得结果,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();
所以我目前有一个订阅,其中有 returns 个团队,在团队内部有一个存储用户对象的数组。我想为这些用户中的每一个调用另一个订阅。 这是团队对象的视图:
team: {
teamName: 'blueberries',
teamMembers: [{UserObject}, {UserObject}]
}
下面是 userObject:
user: {
uid: 1,
uname: 'DPR'
}
我目前有这段代码,我在其中为团队订阅了一个 getRequest,然后点击团队 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()
尝试如下操作
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
获得结果,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();