如何在管道内调用 forkJoin?
How to call forkJoin inside a pipe?
长话短说;博士
是否可以在可观察对象的管道内使用 forkJoin?
全文:
我有一个 returns Observable 对象数组的服务。对于这些对象中的每一个,我都需要再次调用一个 returns 可观察的服务,并对每个结果应用另一个操作。
op1 ->[] ----> op2 --> op3
\-> op2 --> op3
\-> op2 --> op3
我目前的解决方案是这样的:
this.tournamentParticipantService.getNotAssigned(this.tournamentId).subscribe(
(players: Player[]) => {
let dict = {};
players.forEach(player => {
dict[player.id] = this.teamService.add(
{
id: 0,
members: [],
tournament: this.tournamentId,
name: player.name + " " + player.surname
})
.pipe(
map((team: Team) =>
this.teamMemberService.add({ player: player.id, team: team.id })
))
});
forkJoin(dict).subscribe(result => console.log(result));
});
我想摆脱第一个订阅并改用管道。问题是 forkJoin 的教程将其显示为对象或数组传递到的源,而不是作为管道的一部分。
从地图内部调用 forkJoin
.pipe(
map(value=>forkJoin(value))
returns Observable<Observable<resolved forkJoin arguments>>
我可能需要递归订阅。好像不是什么好办法
不带参数将 fJ 放入管道中
this.tournamentParticipantService.getNotAssigned(this.tournamentId).pipe(
map((players: Player[]) => players.map(
(player: Player) => this.teamService.add({ id: 0, members: [], tournament: this.tournamentId, name: player.name + " " + player.surname })
.pipe(
map((team: Team) => {
let pipe = new JsonPipe();
console.log("team: " + pipe.transform(team) + " player: " + pipe.transform(player));
this.teamMemberService.add({ player: player.id, team: team.id });
})))),
forkJoin
).subscribe((result: [[Observable<void>]]) => {
console.log(result)
result[0].forEach(element => {
element.subscribe(res => console.log(res));
});
});
以可观察到的奇怪的纠结结构结束。这个好像也不是什么好办法
甚至可以从管道内部使用 forkJoin 吗?
我认为你缺少的东西是 forkJoin
将 return 一个可观察的,所以标准 map
不是你要找的东西:你需要使用将以适当方式处理可观察结果的地图之一(即 switchMap
、exhaustMap
、mergeMap
):
.pipe(
switchMap(value => forkJoin(getThingOne(value), getThingTwo(value)))
.subscribe(([thing1, thing2]) =>
{
})
解决方案的最终形式是:`
this.tournamentParticipantService.getNotAssigned(this.tournamentId).pipe(
map((players: Player[]) => players.map(
(player: Player) => this.teamService.add({ id: 0, members: [], tournament: this.tournamentId, name: player.name + " " + player.surname })
.pipe(
map((team: Team) =>
this.teamMemberService.add({ player: player.id, team: team.id }))
))),
mergeMap((tasks: Observable<Observable<void>>[]) => forkJoin(tasks)),
mergeMap((tasks: Observable<void>[]) => forkJoin(tasks))
).subscribe(() => {
this.loadTeams();
});
`
长话短说;博士 是否可以在可观察对象的管道内使用 forkJoin?
全文: 我有一个 returns Observable 对象数组的服务。对于这些对象中的每一个,我都需要再次调用一个 returns 可观察的服务,并对每个结果应用另一个操作。
op1 ->[] ----> op2 --> op3
\-> op2 --> op3
\-> op2 --> op3
我目前的解决方案是这样的:
this.tournamentParticipantService.getNotAssigned(this.tournamentId).subscribe(
(players: Player[]) => {
let dict = {};
players.forEach(player => {
dict[player.id] = this.teamService.add(
{
id: 0,
members: [],
tournament: this.tournamentId,
name: player.name + " " + player.surname
})
.pipe(
map((team: Team) =>
this.teamMemberService.add({ player: player.id, team: team.id })
))
});
forkJoin(dict).subscribe(result => console.log(result));
});
我想摆脱第一个订阅并改用管道。问题是 forkJoin 的教程将其显示为对象或数组传递到的源,而不是作为管道的一部分。
从地图内部调用 forkJoin
.pipe(
map(value=>forkJoin(value))
returns Observable<Observable<resolved forkJoin arguments>>
我可能需要递归订阅。好像不是什么好办法
不带参数将 fJ 放入管道中
this.tournamentParticipantService.getNotAssigned(this.tournamentId).pipe(
map((players: Player[]) => players.map(
(player: Player) => this.teamService.add({ id: 0, members: [], tournament: this.tournamentId, name: player.name + " " + player.surname })
.pipe(
map((team: Team) => {
let pipe = new JsonPipe();
console.log("team: " + pipe.transform(team) + " player: " + pipe.transform(player));
this.teamMemberService.add({ player: player.id, team: team.id });
})))),
forkJoin
).subscribe((result: [[Observable<void>]]) => {
console.log(result)
result[0].forEach(element => {
element.subscribe(res => console.log(res));
});
});
以可观察到的奇怪的纠结结构结束。这个好像也不是什么好办法
甚至可以从管道内部使用 forkJoin 吗?
我认为你缺少的东西是 forkJoin
将 return 一个可观察的,所以标准 map
不是你要找的东西:你需要使用将以适当方式处理可观察结果的地图之一(即 switchMap
、exhaustMap
、mergeMap
):
.pipe(
switchMap(value => forkJoin(getThingOne(value), getThingTwo(value)))
.subscribe(([thing1, thing2]) =>
{
})
解决方案的最终形式是:`
this.tournamentParticipantService.getNotAssigned(this.tournamentId).pipe( map((players: Player[]) => players.map( (player: Player) => this.teamService.add({ id: 0, members: [], tournament: this.tournamentId, name: player.name + " " + player.surname }) .pipe( map((team: Team) => this.teamMemberService.add({ player: player.id, team: team.id })) ))), mergeMap((tasks: Observable<Observable<void>>[]) => forkJoin(tasks)), mergeMap((tasks: Observable<void>[]) => forkJoin(tasks)) ).subscribe(() => { this.loadTeams(); });
`