Как отправить одно и то же действие несколько раз из эффектов ngrx

Я хочу отправить действие несколько раз от моего эффекта, для этой цели я использую 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 ответа

Вы должны использовать flatmap в этом случае. Это должно работать:

@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;
}

Я думаю, что ваша проблема в том, что concatMapped Observable закрывается, когда закрывается последний из переданных ему 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;
    }
Другие вопросы по тегам