У меня есть 2 объекта: получатель платежа и транзакция. У меня есть payeeCreateEpic
, который фильтрует на started
испускает обычную цепочку finished
/ failed
. То же самое для transactionCreateEpic
.
Для простоты предположим, что Получатель платежа имеет только UUID и Имя. Однако транзакция может иметь одну из 3-х возможностей: не привязана ни к одному получателю (полезная нагрузка имеет payee: null
), присоединена к существующему получателю (в пользовательском интерфейсе у пользователя есть выпадающий список всех получателей, где он выбирает одну, полезная нагрузка, имеющая payee: payee-uuid
) или прикреплен к не существующему получателю (в пользовательском интерфейсе пользователь имеет возможность создать получателя, который не сохраняется в бэкэнде, но должен быть сохранен, если вся транзакция сохранена, в полезной нагрузке, которую я отправляю payee: payee-name
).
Теперь, если транзакция создания отправлена без получателя или существующего получателя, я просто перехожу на POST /transactions
и жду его разрешения, чтобы выполнить действие finished
или failed
действия transactionCreateEpic
.
Однако, если !isUuid(txPayload.payee)
оценивается как true, в эпосе transactionCreateEpic
я хочу инициировать payeeCreateEpic
с именем получателя и ждать finished
=>, затем создать транзакцию с идентификатором получателя из бэкэнд или failed
=> прервать транзакцию (и отобразить ошибку для пользователя).
Я не уверен, как это сделать, поскольку в эпосе транзакции я уже в фильтре для действия TRANSACTION_CREATE_STARTED
и не уверен, как подписаться на другое действие, генерируемое payeeCreateEpic
.
Код:
const createPayeeEpic = (actions$: Observable<Action>) =>
actions$.pipe(
filter(CreateAction.start.match),
mergeMap((action) =>
from(MoneyPinApiClient.getInstance().payee.create(CreateRequestAdapter(action.payload))).pipe(
map((response) => CreateAction.success({
params: action.payload,
result: CreateResultAdapter(response.data)
})),
catchError((err) => of(
<any>CreateAction.failure({params: action.payload, error: err}),
<any>MoneyPinApiErrorAction(err)
))
)
)
);
const createTransactionEpic = (actions$: Observable<Action>) =>
actions$.pipe(
filter(CreateAction.start.match),
mergeMap((action) => {
if(!isUuid(action.payload.payee) {
**EMIT PayeeCreateAction.start({name: action.payload.payee})**
**WAIT FOR PayeeCreateAction.success (or PayeeCreateAction.failure)**
action.payload.payee = resultOf(PayeeCreateAction.success).id;
}
return from(MoneyPinApiClient.getInstance().transaction.create(CreateRequestAdapter(action.payload))).pipe(
map((response) => CreateAction.success({
params: action.payload,
result: CreateResultAdapter(response.data)
})),
catchError((err) => of(
<any>CreateAction.failure({params: action.payload, error: err}),
<any>MoneyPinApiErrorAction(err)
))
)
})
);
Посмотрите на createTransactionEpic
, вот где я с трудом могу инициировать createPayeeEpic + ожидание успешного сбоя.