вызов нескольких действий от эффекта - PullRequest
0 голосов
/ 30 мая 2019

пожалуйста, смотрите изменения

У меня есть эффект, который извлекает из http список объектов.

При получении я хочу, чтобы тот же эффект отправлял для каждого объекта действие, которое откроет канал для получения обновления этого объекта в реальном времени

  @Effect()
  getUsedDrones$ = this.actions$.pipe(
    ofType<featureActions.GetUsedDronesRequest>(featureActions.ActionTypes.GetUsedDronesRequest),
    switchMap((action) =>
      this.droneDataService.getUsedDrones(action.payload).pipe(
        map(drones => {
          drones.forEach((drone) => new featureActions.OpenUsedDroneUpdateChannelRequest({ droneId: drone.id, projectId : environment.projectId }));
          new featureActions.GetUsedDronesSuccess({drones});
        }),
        catchError((error: HttpErrorResponse) => {
          this.snackBar.open(this.translate.instant('ERRORS.HTTP.GENERIC'), this.translate.instant('BUTTONS.OK'), {duration: 2500});
          return of(new featureActions.GetUsedDronesFailed({error}));
        }),
      ),
    ),
  );

в основном, после вызова моего API и получения дронов, мне нужно вызывать это для каждого дрона

    map(drones => {
      drones.forEach((drone) => new featureActions.OpenUsedDroneUpdateChannelRequest({ droneId: drone.id, projectId : environment.projectId }));
      new featureActions.GetUsedDronesSuccess({drones});
    }),

, а затем активируйте поиск.

другое действие в основном назовет это

  startUpdate$ = this.actions$.pipe(
    ofType<featureActions.OpenUsedDroneUpdateChannelRequest>(featureActions.ActionTypes.OpenUsedDroneUpdateChannelRequest),
    switchMap((action) =>
      this.droneDataService.openUsedDroneUpdateChannel(action.payload).pipe(
        map(result => {
          if (this.currentUpdateEventList.has(action.payload.droneId)) { return; }
          new featureActions.OpenUsedDroneUpdateChannelSuccess(result);
          this.currentUpdateEventList.set(action.payload.droneId, [
            `get_position_drone${action.payload.droneId}`,
            `get_status_drone${action.payload.droneId}`
          ])
          this.sseService.subscribe(`get_position_drone${action.payload.droneId}`, (position: Cartesian3) => {
            new featureActions.SetUsedDronePosition({droneId : action.payload.droneId, position});
          });
          this.sseService.subscribe(`get_status_drone${action.payload.droneId}`, (status: IDroneStatus) => {
            new featureActions.SetUsedDroneStatus({droneId : action.payload.droneId, status});
          });
        }),
        catchError((error: HttpErrorResponse) => {
          this.snackBar.open(this.translate.instant('ERRORS.HTTP.DRONE.NOT_UPDATABLE', {droneId: action.payload.droneId}), this.translate.instant('BUTTONS.OK'), {duration: 2500});
          return of(new featureActions.OpenUsedDroneUpdateChannelFailed({error}));
        }),
      )
    )
  );

Теперь у меня проблема в следующем: мой первый foreach возвращает эту ошибку

core.js: 15724 Ошибка ОШИБКИ: эффект "UsedDronesEffect.getUsedDrones $" отправил недействительное действие: undefined

core.js: 15724 ОШИБКА TypeError: Действия должны быть объектами в ActionsSubject.push ../ node_modules/@ngrx/store/fesm5/store.js.ActionsSubject.next

РЕДАКТИРОВАТЬ: Я исправил ошибку, но теперь мои действия forEach не отправляются

    map(drones => {

      drones.forEach((drone) => new featureActions.OpenUsedDroneUpdateChannelRequest({ droneId: drone.id, projectId : environment.projectId }));
      return new featureActions.GetUsedDronesSuccess({drones});
    }),

Как я могу вернуть список действий, основанный на количестве дронов, которые у меня есть, и в итоге добиться успеха?

РЕДАКТИРОВАТЬ 2:

не должно ли это работать?

map(drones => {
  const actions = [];
  drones.forEach((drone) => actions.push(new featureActions.OpenUsedDroneUpdateChannelRequest({ droneId: drone.id, projectId : environment.projectId })));
  actions.push(new featureActions.GetUsedDronesSuccess({drones}));
  return merge(actions);
}),

1 Ответ

0 голосов
/ 30 мая 2019

Проверьте это. Я надеюсь, что это решит вашу проблему.

отправка нескольких действий из одного эффекта @ ngrx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...