6

TL;DRオブザーバブルのパイプ内で forkJoin を使用することは可能ですか?

全文: オブジェクトの配列の Observable を返すサービスがあります。これらのオブジェクトごとに、オブザーバブルを返すサービスをもう一度呼び出し、それぞれの結果に別の操作を適用する必要があります。

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))

おそらく再帰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 を使用することさえ可能ですか?

4

2 に答える 2

0

ソリューションがとった最終的な形式は次のとおりです。

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

`

于 2019-07-17T07:27:17.623 に答える