Вы можете использовать switchMap
и combineLatest
, чтобы достичь этого, но я не видел в вашем коде, где вы хотите использовать результат селектора (данные, поступающие от селектора).Я предположил, что исходное действие (CreateMissionRequest
) имеет два атрибута в своей полезной нагрузке: routeId
и mission
.Но это не имеет никакого смысла, потому что вы используете селектор и никогда не используете его результат снова.Но вы можете получить общую идею, взглянув на приведенную ниже технику, и делать все, что захотите.
ОБНОВЛЕНО createMission$ = this.actions$.pipe(
ofType<featureActions.CreateMissionRequest>(featureActions.ActionTypes.CreateMissionRequest),
// This is where you use the switchMap
switchMap((action) =>
// combineLatest here makes it possible to pass forward the results
// from the selector and the original action if you need
combineLatest([
this.store$.pipe(select(MissionsStoreSelectors.getById(), {id : action.payload.routeId}),take(1)),
of(action.payload.routeId),
])),
switchMap(([mission,routeId]) =>
this.dataService.createMission(mission).pipe(
map(response => new featureActions.CreateMissionSuccess({response, mission})),
catchError((error: HttpErrorResponse) => {
this.snackBar.open(this.translate.instant('ERROR.HTTP.GENERIC'), this.translate.instant('BUTTON.OK'), {duration: 2500});
return of(new featureActions.CreateMissionFailed({error}));
}),
),
),
);
Фактически, если вам просто нужно преобразовать наблюдаемое в другое,switchMap
может сделать работу за вас, нет необходимости в combineLatest
:
createMission$ = this.actions$.pipe(
ofType<featureActions.CreateMissionRequest>(featureActions.ActionTypes.CreateMissionRequest),
switchMap((action) =>
this.store$.pipe(select(MissionsStoreSelectors.getById(), {id : action.payload.routeId}),take(1))),
switchMap((mission) =>
this.dataService.createMission(mission).pipe(
map(response => new featureActions.CreateMissionSuccess({response, mission})),
catchError((error: HttpErrorResponse) => {
this.snackBar.open(this.translate.instant('ERROR.HTTP.GENERIC'), this.translate.instant('BUTTON.OK'), {duration: 2500});
return of(new featureActions.CreateMissionFailed({error}));
}),
),
),
);