NgRx Effect отправляет несколько событий после вызова службы с данными из массива полезной нагрузки

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

Итак, у меня есть действие LoadUserRole, которое принимает массив пользователей:

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 в соответствии с адаптером сущности 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,
  });
}

person Sytham    schedule 27.06.2018    source источник
comment
как выглядит твой LoadUserRoleSuccess?   -  person dee zg    schedule 27.06.2018
comment
Просто мысль, но, может быть, она решена простой заменой concatMap на mergeMap   -  person Silvan Bregy    schedule 27.06.2018
comment
Нет, такая же ошибка, хотя спасибо за комментарий   -  person Sytham    schedule 27.06.2018
comment
Можете ли вы поделиться своими определениями типа действия?   -  person Okan Aslankan    schedule 01.07.2018


Ответы (1)


Поскольку вы используете там карту, попробуйте следующее:


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

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

person Gabriel George    schedule 30.01.2019