Во время эффекта вызов ngrx в два раза меньше
Я разрабатываю, используя угловое приложение, используя 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 ответа
Решение
Я наконец решил свою проблему другим путем. Сейчас я отправляю еще одно действие внутри основного действия по обновлению состояния. Например, вот как я это сделал:
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>,
) { }
}
Это решило мою проблему приятно.
Эффект - это поток, будет отправлено только последнее действие в потоке.
Для вашего случая вы можете слушать на LoginUser
в вашем редукторе и опустошить ваше состояние.