Angular NgRx - отправляет действие из эффекта, когда другие действия возвращают значение - PullRequest
1 голос
/ 18 октября 2019

У меня проблемы с отправкой действий, для которых нужны результаты других пяти действий (перечисленных в моем эффекте).

Может ли кто-нибудь помочь мне с этим? Напомним, что мне нужно отправить действие внутри эффекта, когда эти пять действий вернули значение.

Вот код, после которого я хотел бы вызвать getProject () :

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

И вот пример проекта каждого из этих пяти действий (или, скорее, эффектов, которые они вызывают):

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

1 Ответ

0 голосов
/ 18 октября 2019

Перейти к 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 выдаст объединенное значение в виде массива после завершения всех внутренних наблюдаемых.

...