У меня была такая же ситуация (и предполагая, что NgRx 10 или выше), у меня другая точка зрения, более фундаментальный способ использования эффектов. Последовательный запуск нескольких действий в одном месте, особенно в рамках одного эффекта, является анти-паттерном. По сути, важно поддерживать согласованный общий поток состояний приложения в NgRx действий и потенциалов. сокращения. Так же, как это предусмотрено архитектурой NgRx.
После 3 правила эффекта уже помогут избежать сложных ситуаций:
- Назовите эффекты как название эффекта
- Сделайте так, чтобы ваш эффект делал только одно
- Выпустить только одно действие
Таким образом, это поможет вам следовать шаблону проектирования разделения проблем, который, конечно, также поможет вам эффекты NgRx, чтобы сделать их более пригодными для модульного тестирования.
Вернемся к вашему примеру, вы можете просто отделить то, что вы хотите сделать (2 дополнительных действия), с помощью промежуточного действия.
В вашем случае кажется, что вам может не понадобиться даже ваш исходный эффект dispathMultipleActions $, если внутри не появится особая логика. (который, возможно, может принадлежать редуктору состояния, который еще более поддается модульному тестированию).
Предполагая, что ActionTypes.UpdateSomething уже имеет объект полезной нагрузки массива, вы можете разделить свои dispathMultipleActions $ на отдельные, чтобы сделать что-то вроде этого:
@Effect()
deleteAction$ = this.actions$.pipe(
ofType(ActionTypes.UpdateSomething),
concatMap(from(new Promise((array) => {
array.forEach(item => {
if (item > 3) {
//do something
}
});
}))),
{dispatch: false}
);
@Effect()
changeAction$ = this.actions$.pipe(
ofType(ActionTypes.UpdateSomething),
concatMap(from(new Promise((array) => {
array.forEach(item => {
if (item <= 3) {
//do something
}
});
}))),
{dispatch: false}
);
24.02.2021