所有动作后执行Ngrx /效果

时间:2018-06-04 09:32:04

标签: javascript angular ngrx ngrx-effects

我有效添加迭代数组的动作:

@Effect()
changeId$ = this.actions$.pipe(
  ofType(ActionTypes.ChangeId),
  withLatestFrom(this.store.select(fromReducers.getAliasesNames)),
  switchMap(([action, aliasesNames]: [ChangeId, string[]]) => {
    const actions: Action[] = [];
    aliasesNames.forEach((alias) => {
      actions.push(new AddField(alias));
    });
    return actions;
  })
);

此外,我还有另一种听取AddField动作的效果:

 @Effect()
 update$ = this.actions$.pipe(
  ofType(ActionTypes.AddField),
  withLatestFrom(this.store.select(fromReducers.GetSomeData)),
  switchMap(([action, someData]: [AddField, string[]]) => {
     // make something depend on adding field
  })
 );

问题是我希望每次AddField操作后都会调用更新$效果。但是,而不是这个AddField caleed三次,然后update$效果也被称为三次。我觉得我的经营者错了。您能否提出我应该为此目的使用哪些操作员?

1 个答案:

答案 0 :(得分:0)

您可以想象一个动作队列,并且可以将动作添加到该队列中。在一个“周期”中,将按以下方式处理动作。

  1. 执行reducer
  2. 执行效果

此订单为guaranteed。假设您触发了changeId操作。发生的事情是执行减速器并寻找该动作。然后执行效果。这种特殊的效果将几个addField动作放入动作队列。这就是你的意思

但不是这个AddField减少了三倍...

下一步,addField动作的化简执行X次,然后将效果称为X次。这就是指

然后调用$$效果也要三遍。

正如@ibenjelloun在评论中所建议的那样,请执行addFields动作并具有一系列作为有效载荷的项目。