当前位置: 首页 > 知识库问答 >
问题:

如何在管道内调用forkJoin?

弘思聪
2023-03-14

TL;DR可以在可观察到的管道内使用forkJoin吗?

完整的故事:我有一个服务,返回可观察的对象数组。对于这些对象中的每一个,我都需要对返回可观察对象的服务进行另一个调用,并对每个结果应用另一个操作。

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

返回可观察

将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个答案

司英飙
2023-03-14

解决方案的最终形式是:`

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

`

洪和平
2023-03-14

我认为您缺少的是,forkJoin将返回一个可观察的,因此标准的map不是您想要的:您需要使用一个能够以适当方式处理可观察结果的映射(即开关映射排气映射合并映射):

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

})
 类似资料:
  • 问题内容: 我有两条詹金斯管道,比方说管道A和管道B。我想在管道B中调用管道A。我怎样才能做到这一点? (管道A是管道B的子集。管道A负责执行一些日常工作,可以在管道B中重用) 我已经在计算机上安装了Jenkins 2.41。 问题答案: 以下解决方案对我有效: 在此处添加“管道:构建步骤”官方文档的链接:https : //jenkins.io/doc/pipeline/steps/pipeli

  • 问题内容: 在Linux终端中,当一个命令的输出太长而无法在一页中读取时,我可以这样做: 这样我就可以读取cat文件的输出并上下滚动。 如何在IPython中执行此操作? 例如,我尝试了一下,但没有成功: 我最初的问题是通过Shift + Page Up不能看到来自的输出,并且我不想更改滚动缓冲区。 问题答案: 在IPython中,您可以使用标准的寻呼机(通常是)来显示对象。另外,您可以增加终端的

  • 问题内容: 我想搭配使用。我尝试了各种解决方案,但到目前为止没有任何效果。有人可以指导我怎么做吗? 问题答案: 要将管道与模块一起使用,必须通过。 但是,出于各种原因,这并不是真正可取的选择,其中最重要的是安全性。相反,请分别创建和流程,然后将输出从一个管道输送到另一个管道,如下所示: 但是,在您的特定情况下,简单的解决方案是先调用然后在输出上。

  • 可以在jenkins管道共享库中导入和使用常规java库吗?我想导入AWS SDK for java,并在管道代码中直接使用它。我必须将其添加到共享库的src dir中吗?

  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 问题内容: 我有很多数据要插入(SET \ INCR)到redis DB,所以我正在寻找通过 node.js* 进行管道 \ 大量插入的操作。 * 我在node.js中找不到任何好的示例/ API,因此任何帮助都将非常有用! 问题答案: 是的,我必须同意缺少示例,但是我设法创建了一个流,在该流上我批量发送了几个插入命令。 您应该为redis流安装模块: 这就是您使用流的方式: 另外,您可以根据需要