如何完成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数据库中我存储了一个人的食物数据,该数据将 覆盖提供的默认食品数据
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})
]))