我正在编写一个效果,该效果需要几个单独的服务调用的结果(作为可观察对象返回),然后才能完成它。第一个服务调用必须在另外 3 个(可以是异步的)之前完成,然后我构建我的操作列表。我让它工作,但感觉它是不必要的嵌套。
@Effect() loadMyData$: Observable<any> = this.actions$.pipe(
ofType(fromMyData.LOAD_DATA),
switchMap((action: fromMyData.Load) => {
return this.dataService.openMyData(action.payload).pipe(
switchMap(() => this.dataService.getShapes()),
switchMap(shapeData => {
return this.dataService.getCircles().pipe(
switchMap((circleData) => {
return this.dataService.getTriangles().pipe(
switchMap((triangleData) => {
const flatMyDataWithReferences: any = {
triangleName: triangleData.name,
shapeName: shapeData.name
};
return [
new fromShapes.Load(),
new fromBalls.Load(),
new fromCircles.LoadListSuccess(
this.organizeCircles(circleData)),
new fromMyData.LoadSuccess(flatMyDataWithReferences),
new fromUi.AddMessage({
type: MessageType.Success, message: 'Successfully loaded my data ' +
shapeData.name +
' from: ' + action.payload
})
];
}),
catchError((err) => this.myDataLoadErrorEvents(err))
);
}),
catchError((err) => this.myDataLoadErrorEvents(err))
);
}),
catchError((err) => this.myDataLoadErrorEvents(err))
);
}),
catchError((err) => this.myDataLoadErrorEvents(err))
);
基本上,在我的示例代码中,一旦我调用并从dataService.openMyData
调用中返回,我想并行执行这些调用:
dataService.getShapes
dataService.getCircles
dataService.getTriangles
一旦它们全部完成,我想在我的动作数组中使用它们返回的数据return [new etc...]
来完成效果。
希望有人有一种比这种丑陋(和不必要的)缩进地狱更优雅的方式来处理 3 个中介服务调用......
我环顾四周,发现有些人正在使用 forkJoin 来等待多个 observable 的结果,但似乎他们不能使用该 forkJoin observable 的结果作为操作的返回值。例如,下面的这段代码告诉我,我最终没有创建一个 observable,这是我的效果所需要的。
@Effect() loadMyData$: Observable<any> = this.actions$.pipe(
ofType(fromMyData.LOAD_DATA),
switchMap((action: fromMyData.Load) => {
return this.dataService.openMyData(action.payload).pipe(
switchMap(() => {
return forkJoin(
this.dataService.getShapes(),
this.dataService.getCircles(),
this.dataService.getTriangles()
).pipe(
map(joinResult => {
const [shapeData, circleData, triangleData] = joinResult;
const flatMyDataWithReferences: any = {
triangleName: triangleData.name,
shapeName: shapeData.name
};
return [
new fromShapes.Load(),
new fromBalls.Load(),
new fromCircles.LoadListSuccess(
this.organizeCircles(circleData)),
new fromMyData.LoadSuccess(flatMyDataWithReferences),
new fromUi.AddMessage({
type: MessageType.Success, message: 'Successfully loaded my data ' +
shapeData.name +
' from: ' + action.payload
})
];
})
);
}),
catchError((err) => this.myDataLoadErrorEvents(err))
);
}),
catchError((err) => this.myDataLoadErrorEvents(err))
);