Вы можете использовать switchMap
вместо оператора map
, чтобы иметь возможность вернуть array
действий, которые затем будут генерировать каждое действие:
...
this.ReservationReqService.sendReservationRequest(action.reservationRequest).pipe(
switchMap(response => {
if (response.status) {
this.helperService.snackbar('Request Sent.');
return [
ReservationReqActions.bookPropertyRequestSuccess({ reservationRequest: response.result }),
UiActions.notificationNew({...})
]
...
Предложение
Вот предложение по рефакторингу с меньшим количеством кода:
bookPropertyRequest$ = createEffect(() => this.actions$.pipe(
ofType(ReservationReqActions.bookPropertyRequest),
concatMap(action =>
this.reservationReqService.sendReservationRequest(action.reservationRequest).pipe(
switchMap(response => [
ReservationReqActions.bookPropertyRequestSuccess({ reservationRequest: response.result }),
UiActions.notificationNew({...})
]),
catchError(errorResponse => [
ReservationReqActions.bookPropertyRequestFailure({
error: errorResponse.error
}),
UiActions.errorAlert(errorResponse.error.message);
])
)
);
));
Для этого вам нужно вернуть ответ "classi c" с HttpClient
внутри вашего sendReservationRequest
метода:
sendReservationRequest(request: ReservationRequest) {
return this.httpClient.post(SERVICE_URL);
// no {observe: 'response'} here
}
Примечание : Очень просто в этом примере, но, возможно, в некоторых ситуациях может потребоваться проверить содержимое errorResponse
внутри catchError
. Чтобы избежать проблем с errorResponse.error.message
... Out of topi c здесь.