首页 > 解决方案 > Angular NgRx Effect concatMap 基于条件的多个 HTTP 请求

问题描述

我有一个通过concatMap方法映射到 HTTP 请求的操作,因为我需要对这些 HTTP 请求进行排序。我想通过仅对在操作中发送的具有相同对象 ID 的 HTTP 请求进行排序来改进此行为。

这是我正在工作的代码,但是使所有请求按顺序排列。我将它用于记录的内联编辑,并且我希望如果用户更改value1ID:1 的记录然后更改value2ID:1 这些调用将是顺序的,但如果他更改value1ID:2 的记录同时,它会同时执行 ID:2 记录的保存请求和 ID:1 记录的保存请求。这可以用一些地图方法吗?

@Effect()
saveEffect = this.actions.pipe(
  ofType(saveAction),
  concatMap(action => this.service.save(action.oID, action.saveData)
    .pipe(
      map(...),
      catchError(...)
    )
  )
);

标签: javascriptangularrxjsngrxngrx-effects

解决方案


您可以使用groupByid 对您的操作进行分组。该操作符将在 Observable 上为其特定组发出每个传入的操作。

saveEffect = this.actions.pipe(
  ofType(saveAction),
  groupBy(action => action.oID),
  mergeMap(group$ => group$.pipe(
    concatMap(action => this.saveAction(action))
  ))
);

saveAction(action): Observable<any> {
  return this.service.save(action.oID, action.saveData).pipe(
    map(...),
    catchError(...)
  )
}

推荐阅读