如何在管道内调用 forkJoin?

mor*_*icz 5 rxjs angular rxjs-pipeable-operators

TL;DR 是否可以在 observable 的管道内使用 forkJoin?

全文:我有一个返回对象数组的 Observable 的服务。对于这些对象中的每一个,我都需要再次调用返回一个可观察对象的服务,并对每个结果应用另一个操作。

op1 ->[] ----> op2 --> op3
          \\-> op2 --> op3
           \-> op2 --> op3
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是这样的:

op1 ->[] ----> op2 --> op3
          \\-> op2 --> op3
           \-> op2 --> op3
Run Code Online (Sandbox Code Playgroud)

我想摆脱第一个订阅并改用管道。问题是 forkJoin 的教程将其显示为对象或数组传递到的源,而不是管道的一部分。

从地图内部调用 forkJoin

.pipe(
    map(value=>forkJoin(value))
Run Code Online (Sandbox Code Playgroud)

返回Observable<Observable<resolved forkJoin arguments>>我可能需要递归订阅。好像不是什么好办法。

无参数地将 fJ 放入管道中

    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));
     });
Run Code Online (Sandbox Code Playgroud)

以可观察的奇怪的纠结结构结束。这似乎也不是一个好方法。

甚至可以从管道内部使用 forkJoin 吗?

Joh*_*ohn 16

我认为您缺少的是forkJoin将返回一个可观察的,因此标准map不是您要寻找的:您需要使用以适当方式处理可观察结果的地图之一(即switchMapexhaustMap, mergeMap):

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

})
Run Code Online (Sandbox Code Playgroud)