Прежде всего, многие реквизиты для этой удивительной библиотеки! Тем не менее, я все еще боюсь использования. Я хотел бы назвать еще один эпический первый и подождать, пока он не завершится, прежде чем продолжить текущую эпопею. Скажем, у меня есть форма, где пользователь может изменить ситуацию. Прежде чем загружать другие данные в форму, я хочу сначала сохранить текущие изменения. Любые мысли по этому поводу?Вызов эпики из других эпосов
ответ
Похоже, вы хотите: если один эпик хотел бы начать еще одну работу над эпосом, и дождитесь его завершения, прежде чем продолжить.
Один из подходов (с использованием псевдослов), при получении начального действия LOAD_OTHER_DATA
, вы сразу же начинаете прослушивать один SAVE_FORM_FULFILLED
, который сигнализирует, что форма сохранена (мы немного отпишем ее). Когда получено, mergeMap
(или switchMap
, не имеет значения, в этом случае), что в наш звонок для загрузки других данных loadOtherDataSomehow()
и выполните обычный бизнес. Наконец, трюк, чтобы начать фактическую сохранность формы, которую мы ждем, добавляет startWith()
в конце всей цепочки - это будет испускать и отправлять действие, чтобы фактически сохранить форму.
const saveFormEpic = (action$, store) =>
action$
.ofType('SAVE_FORM')
.switchMap(() =>
saveFormSomeHow(store.getState().formDataSomewhere)
.map(details => ({
type: 'SAVE_FORM_FULFILLED'
}))
);
const loadOtherDataEpic = action$ =>
action$
.ofType('LOAD_OTHER_DATA')
.switchMap(() =>
action$.ofType('SAVE_FORM_FULFILLED')
.take(1) // don't listen forever! IMPORTANT!
.mergeMap(() =>
loadOtherDataSomeHow()
.map(otherData => ({
type: 'LOAD_OTHER_DATA_FULFILLED',
payload: otherData
}))
)
.startWith({
type: 'SAVE_FORM'
})
);
Вы не упомянули, как ваша загрузка и сохранение работы, так что это просто псевдо код, который вам нужно изменить для использования.
wow спасибо за подробный ответ! Могу ли я задать еще один небольшой вопрос? Сохранение не является обязательным, как в случае «когда пользователь не сохранил его сам по себе, я бы хотел, чтобы эпос сделал это для него». Поэтому я посмотрел на метод Observer.if() и, похоже, это подойдет, но я не могу это сделать, возможно, в «loadOtherDataEpc». – robinvdvleuten
Просто используйте простой if/else условный – jayphelps
https://gist.github.com/jayphelps/7e708b59c17b4f327558e7e4501a0536 – jayphelps