Существуют различные способы решения этой проблемы.
1- Один из способов - просто использовать оператор defer () в actionTwo.Оператор defer () должен выполнить: выполнить ваш код по подписке , так как они объединены, подписка на of (actionTwo ()) будет выполнена после того, как of (actionOne ()) будет завершена:
export const myEpic = (action$: any) => action$.pipe(
ofType("TEST"),
mergeMap(() => concat(
of(actionOne()),
defer(() => of(actionTwo()))
))
);
2- Другой вариант - это просто сделать switchMap () , это также гарантирует, что когда вы создаете наблюдаемую из (actionTwo ()),(actionOne ()) наблюдаемый уже был отправлен и завершен.switchMap () также обеспечивает последовательный порядок , поэтому вы можете безопасно удалить оператор concat ():
export const myEpic = (action$: any) => action$.pipe(
ofType("TEST"),
mergeMap(() =>
of(actionOne()).pipe(switchMap(() => of(actionTwo())))
)
);
EDIT :
Теперь якажется, я понял, хотя, я не очень хорошо знаком с наблюдаемыми эпопеями.Я видел здесь решение: Составление и секвенирование нескольких эпопей в наблюдаемом редуксе , которые могут решить вашу проблему два.Исходя из этого, я дам 2 предложения.
1-е предложение:
Это предложение просто создает эпос, который сначала подталкивает действие, и ждет действия, которое уже выполнено.чтобы продвинуть действие два.
export const myEpic = (action$: any) => action$.pipe(
ofType('TEST'),
map(() => actionOne()),
mergeMap(() => {
return action$.pipe(
ofType('ACTION_ONE_DONE'),
take(1),
map(() => actionTwo()),
);
})
);
2-е предложение:
Сделай все это в одном эпосе.Поскольку и действие одно, и действие два связаны (одно зависит друг от друга), может иметь смысл объединить оба в один эпос, это будет примерно так:
export const myEpic = (action$: any) => action$.pipe(
ofType('TEST'),
map(() => actionOne()),
mergeMap(() => {
return ajax(..).pipe(
mergeMap((data) => {
return concat(
actionOneDone(action),
of(actionTwo()).mergeMap(() => /* Do action two */ actionTwoDone())
)
}),
)
})
);
Надеюсь, это поможет!