Как я могу отправить другое действующее действие с помощью метода функции Angular 8 NgRx? - PullRequest
1 голос
/ 17 января 2020

Моя среда разработки не указывает на проблему (полностью зеленый), но при ее запуске возникает ошибка. (Я получу http404, и cacheError запустится. Теперь все в порядке, как «тест на ошибку».)

Сообщение об ошибке: ERROR TypeError: "You provided '() => ({ type })' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. Я вижу, но хочу отправить loginFailed действие без подпорок.

HttpIntercept существует! Так что URL будет http://localhost:PORT/user/login. Просто он недоступен.

actions.ts

// imports

export const types = {
    loginStart: '[User] Login start',
    loginSuccess: '[User] Login success',
    loginFailed: '[User] Login fail',
};

export const loginStart = createAction(types.loginStart, props<ILogin>());
export const loginSuccess = createAction(types.loginSuccess, props<IUser>());
export const loginFailed = createAction(types.loginFailed);

effect.ts

import { types } from './actions';
import * as fromActions from './actions';
// and more imports

@Injectable()
export class UserEffects {
    constructor(
        private actions$: Actions,
        private http: HttpClient,
        private router: Router,
    ) {
    }

    loginProcess = createEffect(() => this.actions$.pipe(
        ofType(types.loginStart),
        exhaustMap((action) => {
            return this.http.post<IUser>('/user/login', {
                username: action.username,
                password: action.password,
            }).pipe(
                map(data => {
                    console.log(data);
                    return fromActions.loginSuccess(data);
                }),
                catchError((err) => { // this will run
                    console.log(err);
                    return fromActions.loginFailed;
                }),
            );
        })
    ));
}

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Странно, что вы не получаете ошибку во время компиляции, но я думаю, что это может быть потому, что оператор Rx JS catchError ожидает, что наблюдаемая будет возвращена.

Что-то вроде =>

catchError(err =>
  of(featureActions.LoadFailureAction({ err }))
),

Некоторое время назад столкнулся с этой проблемой и обнаружил, что эта статья Уэса Граймса (Эксперт Google Developer в Angular и члена основной команды NgRx) действительно полезно. https://itnext.io/ngrx-best-practices-for-enterprise-angular-applications-6f00bcdf36d7

0 голосов
/ 17 января 2020

catchError ожидает, что вы вернете наблюдаемое, поэтому, возможно, попробуйте что-то подобное, используя of:

catchError((err) => { // this will run
    console.log(err);
    return of(fromActions.loginFailed());
}),
...