с эффектом отправки разного действия в другом случае - PullRequest
0 голосов
/ 05 июля 2019

У меня есть следующий эффект

  @Effect()
  assignMission$ = this.actions$.pipe(
    ofType<featureActions.AssignUAVMissionRequest>(featureActions.ActionTypes.AssignUAVMissionRequest),
    concatMap(action =>
      of(action).pipe(
        withLatestFrom(this.store$.pipe(select(RoutesStoreSelectors.getById(), {routeId: action.payload.routeId}))),
      )
    ),
    switchMap(([action, route]) => {
      return this.dataService.assignUAVMission(action.payload.params).pipe(
        mergeMap(response => {
          if (route.saveState === RoutesStoreModels.IRouteSaveState.DRAWED) {
            return [
              new RoutesStoreActions.OverrideRoute(),
              new featureActions.AssignUAVMissionSuccess()
            ];
          } else {
            const newRouteId = uuid();
            return [
              new RoutesStoreActions.AddRoute(),
              new featureActions.AssignUAVMissionSuccess()
            ];
          }
        }),
        catchError((error: HttpErrorResponse) => {
          return of(new featureActions.AssignUAVMissionFailed({error}));
        }),
      );
    })
  );

в одном случае, я хочу отправить OverrideRoute и AssignUAVMissionSuccess в другом случае, я хочу вместо этого отправить AddRoute и AssignUAVMissionSuccess.

проблема в том, что мой mergeMap возвращает ошибку

ОШИБКА в src / app / stores / uavs-store / effect.ts (218,18): ошибка TS2345: Аргумент типа '(ответ: AssignMissionResponse) => (AssignUAVMissionSuccess | OverrideRoute) [] |(AssignUAVMissionSuccess | AddRoute) [] 'нельзя назначить параметру типа' (значение: AssignMissionResponse, index: number) => ObservableInput '.

Но я не совсем понимаю, как это можно исправить?

Можно ли иметь эффект, отправляющий другой набор действий?

1 Ответ

1 голос
/ 05 июля 2019

Вы можете решить эту проблему, возвращая массив типа Action, как это -

mergeMap(response => {

          const actions = new Array<Action>();
          if (route.saveState === RoutesStoreModels.IRouteSaveState.DRAWED) {
          actions.push(new RoutesStoreActions.OverrideRoute());
           actions.push(
              new featureActions.AssignUAVMissionSuccess()
            );
           return actions;
          } else {
            const newRouteId = uuid();
           actions.push(new RoutesStoreActions.AddRoute());
           actions.push(
              new featureActions.AssignUAVMissionSuccess()
            );
            return actions;
          }
        })
...