需要帮助将 rxjs forkjoin 调用转换为异步调用(在 ngrx @Effect 内)
Need help converting a rxjs forkjoin call to an async call (inside an ngrx @Effect)
我想重构我使用 forkJoin 工作的一组服务调用。我有一系列来自 ngrx Store<> 的项目,我需要为每个项目进行 http 调用)。
问题 w/forkjoin 是它本质上是一个阻塞操作,所以我需要等待所有调用在它之前完成 return - 它可能是一个很长的列表。
我希望调用是异步的 - 所以循环每个项目,调用服务,然后 return 结果 UI 更新项目。 (让事情有点复杂,它被包裹在 ngrx @Effect 中)
这是我的工作代码:
@Effect()
loadItemValues$: Observable<Action> = this.actions$
.ofType(setActions.LOAD_ITEMS_DATA)
.map(toPayload)
.switchMap(key => {
return this.store.select(fromRoot.getItems)
.flatMap(items => {
let observables = new Array();
for (let i of items) {
observables.push(this.myService.getItemInfo(i, key));
}
return Observable.forkJoin(observables)
.map((res: Grades[]) => {
return new setActions.LoadValuesSuccessAction(res);
})
})
})
我假设我需要创建一个新的 Observable 并再次使用 flatmap,但我想 how/what 将链向上传递以确保为每个项目调用服务并随后调用 LoadValuesSuccessAction Reducer w/the 结果。
如有任何帮助,我们将不胜感激。
变化很小。您需要做的就是替换它:
return Observable.forkJoin(observables)
.map((res: Grades[]) => {
return new setActions.LoadValuesSuccessAction(res);
})
有了这个:
return Observable.merge(...observables)
.map((res: Grades) => {
return new setActions.LoadValuesSuccessAction([res]);
})
不要使用 forkJoin
,只需使用 merge
。这将看到单个 Grades
发出(一旦它们可用)而不是单个 Grades[]
。您还需要将收到的 res
包装在一个数组中,因为您的动作创建者似乎可能接受 Grades[]
参数。
我想重构我使用 forkJoin 工作的一组服务调用。我有一系列来自 ngrx Store<> 的项目,我需要为每个项目进行 http 调用)。
问题 w/forkjoin 是它本质上是一个阻塞操作,所以我需要等待所有调用在它之前完成 return - 它可能是一个很长的列表。
我希望调用是异步的 - 所以循环每个项目,调用服务,然后 return 结果 UI 更新项目。 (让事情有点复杂,它被包裹在 ngrx @Effect 中)
这是我的工作代码:
@Effect()
loadItemValues$: Observable<Action> = this.actions$
.ofType(setActions.LOAD_ITEMS_DATA)
.map(toPayload)
.switchMap(key => {
return this.store.select(fromRoot.getItems)
.flatMap(items => {
let observables = new Array();
for (let i of items) {
observables.push(this.myService.getItemInfo(i, key));
}
return Observable.forkJoin(observables)
.map((res: Grades[]) => {
return new setActions.LoadValuesSuccessAction(res);
})
})
})
我假设我需要创建一个新的 Observable 并再次使用 flatmap,但我想 how/what 将链向上传递以确保为每个项目调用服务并随后调用 LoadValuesSuccessAction Reducer w/the 结果。
如有任何帮助,我们将不胜感激。
变化很小。您需要做的就是替换它:
return Observable.forkJoin(observables)
.map((res: Grades[]) => {
return new setActions.LoadValuesSuccessAction(res);
})
有了这个:
return Observable.merge(...observables)
.map((res: Grades) => {
return new setActions.LoadValuesSuccessAction([res]);
})
不要使用 forkJoin
,只需使用 merge
。这将看到单个 Grades
发出(一旦它们可用)而不是单个 Grades[]
。您还需要将收到的 res
包装在一个数组中,因为您的动作创建者似乎可能接受 Grades[]
参数。