web-dev-qa-db-ja.com

パイプ内にforkjoinを呼び出す方法は?

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));
      });
    });
 _

観測可能な絡み合った構造で終わります。これも良い方法ではないようです。

パイプの内側からフォークロインを使用することもできますか?

4
morynicz

解決策が取られた最終フォームは次のとおりです。

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();
});
 _

`

0
morynicz