пожалуйста, смотрите изменения
У меня есть эффект, который извлекает из 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);
}),