Почему мой диспетчер стреляет только один раз ngrx - PullRequest
0 голосов
/ 21 октября 2018

У меня есть настройка потока входа в систему.Допустим, у меня есть такой сценарий, пользователь нажимает на кнопку входа с неправильными учетными данными, я отправляю действие входа в систему и ожидаю плохих результатов от API, я показываю ошибку с обработчиком ошибок в пользовательском интерфейсе, пользователь помещает новые учетные данные, которые все еще не являютсяПравильно, я должен быть в состоянии повторить процесс выше.

Ну, для меня это не происходит.Диспетчер стреляет только один раз.Я новичок в ngrx и не уверен, где я делаю неправильно, но вот мой код:

Способ входа:

logInUser(user: User) {    
  this.store$.dispatch(new fromUserActions.LoginUser(user));
  this.actions$.ofType(fromUserActions.LOGIN_USER_FAIL);
}

Побочный эффект:

@Effect()
loginUser$ = this.actions$
    .pipe(
        ofType(fromUserActions.LOGIN_USER),
        map((action: fromUserActions.LoginUser) => action.payload),
        switchMap(payload => this.userService.loginUser(payload)),
        map((user) => fromUserActions.LoginUserSuccess(user)),
        catchError((error) => of(new fromUserActions.LoginUserFail(error.message)))
    );

ОшибкаДействие:

export class LoginUserFail implements Action {
   readonly type = LOGIN_USER_FAIL;

 constructor(public payload: any) { }
}

Вот скриншот инструментов dev-разработчика.Как вы можете видеть, первый раз, когда действие входа в систему и сбой просто работают нормально, впоследствии срабатывает только действие входа в систему.

enter image description here

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Проблема в this.actions $ .ofType (fromUserActions.LOGIN_USER_FAIL); .Просто удалите его.

logInUser(user: User) {    
  this.store$.dispatch(new fromUserActions.LoginUser(user));
  this.actions$.ofType(fromUserActions.LOGIN_USER_FAIL); <--- Remove
}

И у вас есть ответ на вызов API.

    @Effect()
    loginUser$ = this.actions$
    .pipe(
        ofType(fromUserActions.LOGIN_USER),
        map((action: fromUserActions.LoginUser) => action.payload),
        switchMap(
            payload => this.userService.loginUser(payload).pipe(
                map((user) => new fromUserActions.LoginUserSuccess(user)),
                catchError((error) => new fromUserActions.LoginUserFail(error.message))
            )
        ),

    );
0 голосов
/ 22 октября 2018

Вы должны отловить ошибку на внутренней наблюдаемой this.userService.loginUser(payload).

https://github.com/ngrx/platform/blob/master/projects/example-app/src/app/books/effects/book.effects.ts#L51

...