0
    this.route.params.pipe(
      concatMap((param) => {
        const ein = param['nonprofit-id'];
        return this.nonprofitService.getNonprofit(ein).pipe(
          concatMap((nonprofit) => {
            this.nonprofit = nonprofit;
            const ratingID = nonprofit.currentRating?.ratingID ? nonprofit.currentRating.ratingID : -1;
            return this.nonprofitService.getRatingForNonprofit(ein, ratingID).pipe(
              concatMap((nonprofitRating) => {
                this.nonprofitRating = nonprofitRating;
                const causeID = this.nonprofit?.cause?.causeID ? this.nonprofit?.cause?.causeID : 0;
                return this.nonprofitService.getSimilarNonprofits(causeID);
              })
            );
          })
        );
      })
    ).subscribe((response) => {
      this.similarNonprofits = response;
    });

上記が Angular RxJS で concatMaps をチェーンする正しい方法であるかどうかを知りたいです。他の 2 つの呼び出しは、問題の「非営利団体」が取得されることに依存しているため、そのオブジェクトを返すことができます。評価と類似の非営利団体は同時に取得できるため、これらの concatMap を相互にネストせずにこれを行う方法があると考えていました。

4

2 に答える 2

2

以前のすべての値を使用する必要がある場合、通常はさらに多くのチェーンをネストして終了しますが、この場合はすでに複雑すぎるように思われるためmap()、次のように Observable を配列 (またはオブジェクト) に入れることができます。

this.route.params.pipe(
  concatMap((param) => {
    const ein = param['nonprofit-id'];
    return this.nonprofitService.getNonprofit(ein).pipe(
      map(nonprofit => [ein, nonprofit]),
    );
  ),
  concatMap(([ein, nonprofit]) => {
    const ratingID = ...;
    this.nonprofitService.getRatingForNonprofit(ein, ratingID).pipe(
      map(nonprofitRating => [nonprofitRating, ein, nonprofit]),
    );
  }),
  concatMap(([nonprofitRating, ein, nonprofit]) => {
    const causeID = ...;
    return this.nonprofitService.getSimilarNonprofits(causeID).pipe(
      map(similar => [similar, nonprofitRating, ein, nonprofit]),
    );
  }
).subscribe(([similar, nonprofitRating, ein, nonprofit]) => { ... });

明らかに、パラメーターとして渡された各配列を連続するconcatMaps にラップ解除する必要はありませんが、要点を理解していただければ幸いです。

于 2021-03-27T22:05:57.503 に答える