已定义单一效果的NGRX批量效果

时间:2019-01-22 17:34:02

标签: ngrx

因此,我正在开发一个具有“计划”概念的应用程序,每个计划都可以添加评论。该部分工作正常,但如果我尝试循环运行,它似乎会失败并感到困惑。

操作:

export class AddComment implements Action {
  readonly type = CommentActionTypes.AddComment;

  constructor(public payload: Comment) {}
}

export class AddCommentSuccess implements Action {
  readonly type = CommentActionTypes.AddCommentSuccess;

  constructor(public payload: Comment) {}
}

效果

  @Effect()
  addComment$: Observable<Action> = this.actions$
  .ofType<AddComment>(CommentActionTypes.AddComment).pipe(
    switchMap(action => this.commentService.addComment(this.disciplineType, action.payload)),
    map((comment: any) => new AddCommentSuccess(comment)),
    catchError(err => of(new AddCommentFail(err)))
  );

实施

苦苦挣扎的事情正在迅速获得成功/我遇到一种情况,我想向多个计划添加重复的评论。

saveSet.forEach(x => {
          comment.plan_id = x.id;
          this.store.dispatch(this.buildAddCommentAction(comment));
        });

供参考:

buildAddCommentAction(comment: DisciplineComment) : Action {
  return new CommentActions.AddComment(comment);
}

正在发生的事情

如果我有5个计划的列表,并且想对所有计划添加重复的注释,我只会在循环中的最后一项上获得成功的响应。

现在我知道这太过分了,即5个单独的客户/服务呼叫。我不知道的是,应该采取什么规定的方法?

1。)一个新的BulkAddComment动作,效果等。我不愿意这样做,因为我有“评论”,“关注点”(功能和需求相似),并且每个“学科”都有一个。那就是大约36种新效果,是动作的两倍。需要认真的重构。

2。)修改1个或多个动作和效果

3。)?

感谢您的输入

1 个答案:

答案 0 :(得分:1)

这是因为您正在使用switchMap运算符,该运算符将取消当前正在运行的可观察到的值,在您的情况下为服务调用。

您将必须使用concatMapmergeMap。如果顺序很重要,请使用concatMap,如果不重要,请使用mergeMap,因为这将使您的服务调用并行进行。

有关更多信息,请观看this