Как вызвать forkJoin внутри трубы? - PullRequest
0 голосов
/ 03 июля 2019

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 изнутри трубы?

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Окончательная форма решения: `

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 голосов
/ 03 июля 2019

Я думаю, что вам не хватает forkJoin вернет наблюдаемое, поэтому стандарт map не то, что вы ищете: вам нужно использовать одну из карт, которая будет обрабатывать наблюдаемый результат соответствующим образом (то есть switchMap, exhaustMap, mergeMap):

.pipe(
    switchMap(value => forkJoin(getThingOne(value), getThingTwo(value)))
.subscribe(([thing1, thing2]) => 
{

})
...