所以我目前有一个订阅,它返回团队,团队内部有一个存储用户对象的数组。我想为这些用户中的每一个调用另一个订阅。 这是团队对象的视图:
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
答案 0 :(得分:1)
尝试以下操作
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()。
答案 1 :(得分:1)
您可以将 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();