TL;観察可能なパイプの内側には、PIPEの内側には使用することが可能ですか?
フルストーリー:私はオブジェクトの配列の観察可能なものを返すサービスを持っています。これらのオブジェクトのそれぞれについて、観測可能なサービスを別の呼び出しにする必要があり、それぞれの結果に別の操作を適用する必要があります。
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のチュートリアルが、オブジェクトまたは配列が配信されるソースとして表示されることです。
インサイドマップからkjoinを呼び出す
.pipe(
map(value=>forkJoin(value))
_
戻り値 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));
});
});
_
観測可能な絡み合った構造で終わります。これも良い方法ではないようです。
パイプの内側からフォークロインを使用することもできますか?
解決策が取られた最終フォームは次のとおりです。
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(); });
_
`