javascript - Angular NgRx - declanșează o acțiune din efect atunci când alte acțiuni returnează o valoare


Am probleme în a trimite acțiuni care necesită rezultate din alte cinci acțiuni (care sunt listate în efectul meu).

Poate cineva să mă ajute cu asta? Ca să rezum, trebuie să declanșez o acțiune în cadrul efectului odată ce aceste cinci acțiuni au returnat o valoare.

Iată codul după care aș dori să apelez getProject():

    getProjectRefData$ = createEffect(() =>
    this.actions$.pipe(
      ofType(GetProjectRefData),
      mergeMap(() =>
        of(
          GetProjectSubTypes(),
          GetAccountCategories(),
          GetProductions(),
          GetCompetitions(),
          GetCompetitionEditions()
        )
      )
    )
  );

Și iată exemplul schematic pentru fiecare dintre aceste cinci acțiuni (sau mai degrabă, efectele pe care le declanșează):

    getCompetitionEditions$ = createEffect(() =>
    this.actions$.pipe(
      ofType(GetCompetitionEditions),
      mergeMap(() =>
        this._factoryService
          .getFactory('/referencedata/competitioneditions')
          .pipe(
            map((res: ICompetitionEdition[]) =>
              GetCompetitionEditionsSuccess({ payload: res })
            ),
            catchError(err => {
              console.error(err);
              return of(
                OpenSnackBar({
                  payload: {
                    type: 'error',
                    message: JSON.parse(err._body).message,
                    id: uuid.v4(),
                  },
                }),
                GetCompetitionEditionsError()
              );
            })
          )
      )
    )
  );

Răspuns #1

Optează pentru forkJoin:

   getProjectRefData$ = createEffect(() =>
    this.actions$.pipe(
      ofType(GetProjectRefData),
      switchMap(action =>
        forkJoin(
          GetProjectSubTypes(),
          GetAccountCategories(),
          GetProductions(),
          GetCompetitions(),
          GetCompetitionEditions()
        )
      ),
      map(([projectSubtypes, accountCategories, productions, competitions, competitionEndings]) => this.someService.get('pass args here'),
      map(callResult => SomeAction(callResult))
    )
  );

forkJoin va emite o valoare combinată sub forma unui array după ce toate observable-urile interne se vor finaliza.