Во время эффекта вызов ngrx в два раза меньше - PullRequest
0 голосов
/ 15 мая 2019

Я занимаюсь разработкой, используя угловое приложение, использующее ngrx. Я определил соглашение ниже для реализации индикатора загрузки:

  • Первоначально состояние каждой сущности установлено равным нулю
  • Запустить эффект пустого объекта при запуске
  • Заполните его извлеченными данными о выполненном эффекте

Теперь один из моих эффектов будет таким:

  @Effect()
  LoginUser$ = this._actions$.pipe(
    ofType<LoginUser>(EUserActions.LoginUser),
    switchMap((params) => { new LoginUserSuccess(<IUser>{}); return of(params); }), // for loading indicator to be shown
    switchMap((params) => this._userService.loginUser(params.payload)),
    switchMap((currentUser: IUser) => of(new LoginUserSuccess(currentUser)))
  )

но вызов редуктора в первом файле switchMap не происходит. В чем проблема.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Я наконец решил свою проблему другим способом. Сейчас я отправляю еще одно действие внутри основного действия по обновлению состояния. Например, вот как я это сделал:

user.service.ts

export class UserService {
  constructor(private _store: Store<IAppState>) { }

  loginUser(model): void {
    this._store.dispatch(new AddBusy(EUserActions.LoginUser));
    this._store.dispatch(new LoginUser(model));
  }

  getAllUsers(): void {
    this._store.dispatch(new AddBusy(EUserActions.GetAllUsers));
    this._store.dispatch(new GetAllUsers());
  }
}

user.actions.ts

export class UserEffects {

  @Effect()
  LoginUser$ = this._actions$.pipe(
    ofType<LoginUser>(EUserActions.LoginUser),
    switchMap((params) => this._userLogic.loginUser(params.payload)),
    switchMap((currentUser: IUser) => { this._store.dispatch(new RemoveBusy(EUserActions.LoginUser)); return of(currentUser); }),
    switchMap((currentUser: IUser) => of(new LoginUserSuccess(currentUser)))
  )

  @Effect()
  getAllUsers$ = this._actions$.pipe(
    ofType<GetAllUsers>(EUserActions.GetAllUsers),
    switchMap(() => this._userLogic.getAllUsers()),
    switchMap((users: IUser[]) => { this._store.dispatch(new RemoveBusy(EUserActions.GetAllUsers)); return of(users); }),
    switchMap((users: IUser[]) => of(new GetAllUsersSuccess(users)))
  )

  constructor(
    private _userLogic: UserLogic,
    private _actions$: Actions,
    private _store: Store<IAppState>,
  ) { }
}

Это хорошо решило мою проблему.

0 голосов
/ 16 мая 2019

Эффект - это поток, будет отправлено только последнее Действие в потоке.

Для вашего случая вы можете прослушать LoginUser в вашем редукторе и очистить ваше состояние.

...