【发布时间】:2017-12-30 18:29:35
【问题描述】:
这就是我的效果..
@Effect() uploadImages$ = this.actions$
.ofType(ProjectActions.UPLOAD_IMAGES)
.map(action => action.payload)
.flatMap(project => this.service.uploadImages(project))
.switchMap((project) => Observable.of(
this.imageActions.loadImages(),
this.projectActions.uploadImagesSuccess(project),
));
尝试在 uploadImagesSuccess 触发之前从 API 加载图像列表。
我尝试使用 .concatMap 和 .mergeMap 代替 .switchMap,但这似乎不是。
对 Effects 和 Observables 还很陌生,从我所遇到的情况来看,我没有找到任何答案。
只需要在另一个完成后触发一个。
编辑 1
所以 loadImages() 触发,一旦完成 API 调用,它就会触发 loadImagesSuccess()。我想我的目标是......
@Effect() uploadImages$ = this.actions$
.ofType(ProjectActions.UPLOAD_IMAGES)
.map(action => action.payload)
.flatMap(project => this.service.uploadImages(project))
.switchMap((project) => Observable.of(
this.imageActions.loadImages(),
this.imageActions.loadImagesSuccess(),
this.projectActions.uploadImagesSuccess(project),
));
在更一般的意义上,我将照片保存到 API 上的项目中。我想在 uploadImagesSuccess() 有效负载到达我的选择器之前刷新我的 ImageState,并且由于 ImageState 没有及时更新而具有未定义的图像路径。
编辑 2
我通过这个解决方案来使用 ForkJoin,https://github.com/ngrx/effects/issues/64
@Effect() uploadImages$ = this.actions$
.ofType(ProjectActions.UPLOAD_IMAGES)
.map(action => action.payload)
.flatMap(project => {
let projectInfo$ = this.projectService.uploadImages(project);
let imageInfo$ = this.imageService.loadImages();
return Observable.forkJoin(projectInfo$, imageInfo$);
})
.mergeMap((results: any[]) => {
let myActions: any[] = [];
let actionGenerators = [
(data: any) => {
return this.projectActions.uploadImagesSuccess(data);
},
(data: any) => {
return this.imageActions.loadImagesSuccess(data);
}
];
results.forEach((data: any, index: number) => {
myActions.push(actionGenerators[index](data));
});
return Observable.from(myActions);
});
不确定这是否是解决此问题的最佳方法,但只要我延迟 API 调用以加载图像,它就可以工作。在没有延迟的情况下,在保存新图像之前加载图像。目前我正在 API 端延迟 loadImages()。
如果可能,我想要一种更好的方法来处理将 API 调用发送到 imageService.loadImages() 直到 projectService.uploadImages() 返回。然后在返回所有数据后,触发更新存储的操作。
建议使用 concat 而不是 forkJoin 以等待一个 API 调用完成,然后再继续下一个。但这会破坏 results.Foreach() 因为结果不再在数组中。
【问题讨论】:
-
你应该返回actions,switchMap里面的函数是否返回actions?
-
@Meir 也许我错了,但我认为他们都这样做.. loadImages 运行一个动作,在 API 调用返回一个 loadImagesSuccess() 动作后,它类似于 uploadImagesSuccess()。我在返回数据时没有遇到问题,而是按照数据返回的顺序。由于 API 需要更长的时间,因此在调用 loadImagesSuccess() 之前会触发 uploadImagesSuccess()。理想情况下,我希望在调用 uploadImagesSuccess 之后调用 loadImagesSuccess,但我无法弄清楚。
-
this.imageActions.loadImages() 是做什么的?监听 loadImages 是否有副作用,它正在点击 api 来获取一组图像?
-
@seescode 是的,监听 loadImages() 有一个副作用,一旦从 API 中返回就会触发 loadImagesSuccess()。