Как правильно вернуть ошибку или ответ в том же Observable? - PullRequest
0 голосов
/ 20 апреля 2020

Я создаю сервис, к которому относятся запросы json-server. Эта услуга будет вызываться в течение NGRX @Effects. Тем не менее, этот метод создает человека, но прежде чем мне нужно проверить, существует ли этот человек для создания этого пользователя или нет, и с этим я сделал следующее:

BACKEND SERVICE

getPeople(id: string): Observable<People> {
    return this.httpClient.get<People>(this.SERVER_URL, {
        params: {
            id,
        },
    });
}

createPeople(people: People): Observable<People | HttpErrorResponse> {
    return this.getPeople(people._id).pipe(
        map((data) => {
            if (data) {
                return this.httpClient.post<People>(this.SERVER_URL, people);
            } else {
                throw new HttpErrorResponse({
                    status: 200,
                    statusText: 'THE USER ALREADY EXISTS IN THE DATABASE, SO THE REQUEST CANNOT BE PROCESSED FOR THE CREATION OF A NEW one.',
                });
            }
        }),
        catchError((error) => throwError(error))
    );
}

ЭФФЕКТЫ

import { Injectable } from '@angular/core';
import { Actions, Effect, ofType } from '@ngrx/effects';
import { switchMap, catchError, map, tap } from 'rxjs/operators';
import { of } from 'rxjs';

import { BackendService } from '@app/services/backend.service';
import { People } from '@shared/interfaces/people.interface';
import * as fromPeopleActions from './people.actions';

@Injectable()
export class PeopleEffects {
    constructor(private action$: Actions, private backend: BackendService) {}

    @Effect()
    create$ = this.action$.pipe(
        ofType(fromPeopleActions.ActionTypes.CREATE),
        switchMap(({ payload }) => {
            const { people } = payload;
            return this.backend.createPeople(people).pipe(
                map((data: People) => of(new fromPeopleActions.PeopleCreateSuccess({ people: data }))),
                catchError((error) => of(new fromPeopleActions.PeopleCreateFail({ error })))
            );
        })
    );
}

Однако IDE сообщает мне следующее error:

Type 'Observable<People | Observable<People> | HttpErrorResponse>' is not assignable to type 'Observable<People | HttpErrorResponse>'.
  Type 'People | Observable<People> | HttpErrorResponse' is not assignable to type 'People | HttpErrorResponse'.
    Type 'Observable<People>' is not assignable to type 'People | HttpErrorResponse'.
      Type 'Observable<People>' is missing the following properties from type 'HttpErrorResponse': name, message, error, ok, and 5 more.ts(2322)

1 Ответ

0 голосов
/ 21 апреля 2020

Проблема в этой строке:

map((data: People) => of(new fromPeopleActions.PeopleCreateSuccess({ people: data }))),

Вы возвращаете Observable, который испускает действия вместо действия, поэтому он должен выглядеть примерно так:

map((data: People) => new fromPeopleActions.PeopleCreateSuccess({ people: data })),
...