首页 > 解决方案 > 有效果在不同的情况下调度不同的动作

问题描述

我有以下效果

  @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/effects.ts(218,18) 中的错误:错误 TS2345:类型参数 '(response: AssignMissionResponse) => (AssignUAVMissionSuccess | OverrideRoute)[] | (AssignUAVMissionSuccess | AddRoute)[]' 不可分配给“(值:AssignMissionResponse,索引:数字)=> ObservableInput”类型的参数。

但我不完全明白这是如何解决的?

是否有可能产生效果调度不同的动作集?

标签: angularreduxrxjsngrx

解决方案


您可以通过返回这样的类型数组来解决它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;
          }
        })

推荐阅读