Как отправить одно и то же действие несколько раз из эффектов 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;
}