У меня есть список пользователей, и мне нужно получить роли для каждого пользователя.
Итак, у меня есть действие LoadUserRole, которое принимает массив Users:
export class LoadUserRole implements Action {
readonly type = UsersActionTypes.LoadUserRole;
constructor(public payload: Array<User>) {}
}
export class LoadUserRoleSuccess implements Action {
readonly type = UsersActionTypes.LoadUserRoleSuccess;
constructor(public payload: { user: Update<User> }) {}
}
Я использую NgRx Effects для обработки побочного эффекта вызова службы:
// Side Effect of the load users action
@Effect()
loadUserRole$ = this.actions$.pipe(
ofType(UsersActionTypes.LoadUserRole),
map((action: LoadUserRole) => action.payload),
filter(users => users.length !== 0),
map((users: User[]) => users.map((user: User) => user.id)),
concatMap((ids: string[]) => ids.map((id: string) =>
this.accountService
.getAccountRole(id)
.pipe(
map((asset: any) => new LoadUserRoleSuccess({
user: {
id: asset.items[0].userId,
changes: {
roleType: asset.items[0].roleType
}
}
})),
catchError(error => {
return of(new LoadUserRoleFailure(error.message));
})
)
)
)
);
Объект, данный LoadUserRoleSuccess, имеет тип Update в соответствии с Entity Adapter NgRx Entity. Таким образом, LoadUserRoleSuccess обновляет пользователя в состоянии, это работает, поскольку я проверил это с одним пользователем.
Однако этот код выдает мне ошибку:
ERROR Error: Effect "UsersEffects.loadUserRole$" dispatched an invalid action: [object Object]
и
ERROR TypeError: Actions must have a type property
Служба учетных записей хорошо регистрирует каждый идентификатор сразу, но по какой-то причине отправка сообщения об успехе не работает, также в службу не поступает вызов бэкэнду.
Как лучше всего справиться с такой ситуацией?
вот моя функция редуктора:
case UsersActionTypes.LoadUserRole: {
return {
...state,
pending: true,
};
}
case UsersActionTypes.LoadUserRoleSuccess: {
return usersAdapter.updateOne(action.payload.user, {
...state,
pending: false,
});
}