NgRx Effect отправляет несколько событий после вызова сервиса с данными из массива полезной нагрузки - PullRequest
0 голосов
/ 27 июня 2018

У меня есть список пользователей, и мне нужно получить роли для каждого пользователя.

Итак, у меня есть действие 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,
  });
}

1 Ответ

0 голосов
/ 30 января 2019

Так как вы используете карту там, попробуйте это:


 map((asset: any) => of(new LoadUserRoleSuccess({
              user: {
                id: asset.items[0].userId,
                changes: {
                  roleType: asset.items[0].roleType
                }
              }
            }))),

of убедится, что он вернется как наблюдаемый объект вместо

...