【发布时间】:2017-03-11 21:23:43
【问题描述】:
我正在尝试使用 ngrx 填充网络/业务/任何类型的相关错误。为此,我在IStore 中添加了一个字段:
export interface IStore {
user: IUser;
sources: ISourceRedux;
errors: IError;
}
如您所见,我正在使用这些 reducer 处理 user 状态:
export class UserReducer {
private static reducerName = 'USER_REDUCER';
public static reducer(user = initialUserState(), {type, payload}: Action) {
if (typeof UserReducer.mapActionsToMethod[type] === 'undefined') {
return user;
}
return UserReducer.mapActionsToMethod[type](user, type, payload);
}
public static USER_LOGIN = `${UserReducer.reducerName}_USER_LOGIN`;
public static USER_LOGIN_SUCCESS = `${UserReducer.reducerName}_USER_LOGIN_SUCCESS`;
private static userLoginSuccess(sourcesRdx, type, payload) {
return Object.assign(<IUser>{}, sourcesRdx, payload);
}
public static USER_LOGIN_FAILED = `${UserReducer.reducerName}_USER_LOGIN_FAILED`;
private static userLoginFailed(sourcesRdx, type, payload) {
return Object.assign(<IUser>{}, sourcesRdx, payload);
}
private static mapActionsToMethod = {
[UserReducer.USER_LOGIN_SUCCESS]: UserReducer.userLoginSuccess,
[UserReducer.USER_LOGIN_FAILED]: UserReducer.userLoginFailed,
};
}
USER_LOGIN 操作已完成,因为我设置了效果:
@Injectable()
export class UserEffects {
constructor(
private _actions$: Actions,
private _store$: Store<IStore>,
private _userService: UsersService,
) { }
@Effect({ dispatch: true })
userLogin$: Observable<Action> = this._actions$
.ofType('USER_REDUCER_USER_LOGIN')
.switchMap((action: Action) =>
this._userService.checkPasswd(action.payload.username, action.payload.password)
.map((user: any) => {
return { type: 'USER_REDUCER_USER_LOGIN_SUCCESS', payload: user };
})
.catch((err) => {
return Observable.of({ type: 'USER_REDUCER_USER_LOGIN_FAILED', payload: { error: err } });
})
);
}
所以,当发生错误时,我会抛出 USER_REDUCER_USER_LOGIN_FAILED 动作,所以 userLoginFailed。
另一方面,我已经创建了这个与错误相关的操作:
export class ErrorReducer {
private static reducerName = 'ERROR_REDUCER';
public static reducer(user = initialErrorState(), {type, payload}: Action) {
if (typeof ErrorReducer.mapActionsToMethod[type] === 'undefined') {
return user;
}
return ErrorReducer.mapActionsToMethod[type](user, type, payload);
}
public static ERROR_APPEARS = `${ErrorReducer.reducerName}_APPEARS`;
private static error(sourcesRdx, type, payload) {
return Object.assign(<IError>{}, sourcesRdx, payload);
}
private static mapActionsToMethod = {
[ErrorReducer.ERROR_APPEARS]: ErrorReducer.error
};
}
但是我怎么能抛出 ERROR_REDUCER_APPEARS 动作呢?什么时候?在哪里?
我已尝试在用户效果内分派操作。不过,我不知道这是否是一种不好的做法:
@Effect({ dispatch: true })
userLogin$: Observable<Action> = this._actions$
.ofType('USER_REDUCER_USER_LOGIN')
.switchMap((action: Action) =>
this._userService.checkPasswd(action.payload.username, action.payload.password)
.map((user: any) => {
return { type: 'USER_REDUCER_USER_LOGIN_SUCCESS', payload: user };
})
.catch((err: any) => {
this._store$.dispatch({ type: 'ERROR_REDUCER_APPEARS', payload: { msg: err.message } });
return Observable.of({ type: 'USER_REDUCER_USER_LOGIN_FAILED', payload: {} });
})
);
}
【问题讨论】:
标签: ngrx