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.
