如何从ngrx效果多次调度相同的动作

时间:2017-08-09 10:03:43

标签: angular ngrx-store ngrx-effects

我想从我的效果中多次发出一个动作,为此我正在使用concatMap,但是当我发送相同的动作时,它会被下一次发送取消。有没有办法在上一次调度完成时调度一个动作。

下面的代码将有助于更好地理解问题。

@Effect()
  setCategory$ = this.actions$
    .ofType(GET_SESSION_AD_SUCCESS)
    .concatMap((action: Action) => {

      const category = action.payload;
      const categoryPath = category.path;
      const categoryDispatchArray = [];

      categoryPath.forEach((path, index) => {
        categoryDispatchArray.push({
          type: GET_SUBCATEGORIES_BY_PARENT,
          payload: { categoryId: path.id, index }
        });
      })

      return dispatchArray;

}

2 个答案:

答案 0 :(得分:1)

在这种情况下,您应该使用平面地图。这应该可以工作:

@Effect()
setCategory$ = this.actions$
.ofType(GET_SESSION_AD_SUCCESS)
.map((action) => action.payload)
.flatMap((payload) => {

  const category = payload;
  const categoryPath = category.path;
  const categoryDispatchArray = [];

  categoryPath.forEach((path, index) => {
    categoryDispatchArray.push({
      type: GET_SUBCATEGORIES_BY_PARENT,
      payload: { categoryId: path.id, index }
    });
  })

  return dispatchArray;
}

答案 1 :(得分:0)

我认为你的问题是当传递给它的最后一个Observable已经关闭时,concatMapped Observable会关闭。您需要的是mergeMap(又名flatMap)。

此外,我还会使用.map来创建dispatchArray:

@Effect()
  setCategory$ = this.actions$
    .ofType(GET_SESSION_AD_SUCCESS)
    .mergeMap((action: Action) => {

      const category = action.payload;
      const categoryPath = category.path;

      const categoryDispatchArray = categoryPath
        .map((path, index) => ({
          type: GET_SUBCATEGORIES_BY_PARENT,
          payload: { categoryId: path.id, index }
        });

      return categoryDispatchArray;
    }