如何完成2个http请求,然后触发另一个操作以合并结果

如何完成2个http请求,然后触发另一个操作以合并结果,http,angular,typescript,ngrx,Http,Angular,Typescript,Ngrx,我在两个不同的数据库中存储了相同的数据类型 在一个SQL数据库中,我存储了所有食物的大量列表 在一个Mongo数据库中我存储了一个人的食物数据,该数据将 覆盖提供的默认食品数据 这两种类型的数据将存储在my ngrx store应用程序状态以及合并状态中 export interface ApplicationState { allSQLFoodData: FoodData; allUserFoodData: FoodData; mergedFoodData: FoodDa

我在两个不同的数据库中存储了相同的数据类型

  • 在一个SQL数据库中,我存储了所有食物的大量列表
  • 在一个Mongo数据库中我存储了一个人的食物数据,该数据将 覆盖提供的默认食品数据
这两种类型的数据将存储在my ngrx store应用程序状态以及合并状态中

export interface ApplicationState {
   allSQLFoodData: FoodData;
   allUserFoodData: FoodData;
   mergedFoodData: FoodData;
}
我需要做的是从后端获取
allSQLFoodData
allUserFoodData
,将这些值存储到状态,并在合并状态下合并两组数据

我通过
dispatch()

以下是我在特效服务中的立场:

初始化数据效果服务。ts

@Injectable()
export class InitializeDataEffectService {

   @Effect() initialize$: Observable<Action> = this.actions$
     .ofType(INITIALIZE_DATA_ACTION)
     .switchMap( (action) => {
      return Observable.combineLatest(
        this.foodService.loadSQLFoods( action.payload ),
        this.userDataService.loadUserData( action.payload )
      )
    })
    .switchMap(([allSQLFoodData, allUserData]) => {
      return Observable.of(
        new SQLFoodsLoadedAction( allSQLFoodData ),
        new UserDataLoadedAction( allUserData ),
        new BuildMergedFoodDataAction({sql: allSQLFoodData, user: allUserData})
      )
    })

  constructor( private actions$: Actions, private foodService: FoodService, private userDataService: UserDataService ) {

  }
}
但这会产生以下错误:

无法从中推断类型参数“T”的类型参数 用法。考虑显式指定类型参数。类型 候选参数“SqlFoodLoadedAction”不是有效的类型参数 因为它不是候选“UserDataLoadedAction”的超类型。 属性“有效负载”的类型不兼容。 类型“AllUserData”不可分配给类型“AllSQLFoodData”。 类型“AllUserData”中缺少属性“foods”

我不知道该怎么做

显式指定类型参数


即使我这样做了,我也不确定
Effect()
decorator现在将如何将结果分配给适当的状态值如何实现此目的?

要从
开关映射
返回一个可观察到的效果,请使用
可观察到的。从
可以获取一个数组:

import 'rxjs/add/observable/from';
import 'rxjs/add/operator/concatMap';

...
.concatMap(([allSQLFoodData, allUserData]) => Observable.from([
  new SQLFoodsLoadedAction( allSQLFoodData ),
  new UserDataLoadedAction( allUserData ),
  new BuildMergedFoodDataAction({sql: allSQLFoodData, user: allUserData})
]))
请注意,
switchMap
是不必要的,因为返回的可观察对象将立即发出。您只需使用
concatMap

此外,效果不会将任何内容指定给状态。它唯一的作用是发出动作。这些操作将由还原程序处理,还原程序将更新应用程序状态的适当部分

import 'rxjs/add/observable/from';
import 'rxjs/add/operator/concatMap';

...
.concatMap(([allSQLFoodData, allUserData]) => Observable.from([
  new SQLFoodsLoadedAction( allSQLFoodData ),
  new UserDataLoadedAction( allUserData ),
  new BuildMergedFoodDataAction({sql: allSQLFoodData, user: allUserData})
]))