2017-02-16 13 views
1

Прежде всего, многие реквизиты для этой удивительной библиотеки! Тем не менее, я все еще боюсь использования. Я хотел бы назвать еще один эпический первый и подождать, пока он не завершится, прежде чем продолжить текущую эпопею. Скажем, у меня есть форма, где пользователь может изменить ситуацию. Прежде чем загружать другие данные в форму, я хочу сначала сохранить текущие изменения. Любые мысли по этому поводу?Вызов эпики из других эпосов

ответ

3

Похоже, вы хотите: если один эпик хотел бы начать еще одну работу над эпосом, и дождитесь его завершения, прежде чем продолжить.

Один из подходов (с использованием псевдослов), при получении начального действия 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' 
     }) 
    ); 

Вы не упомянули, как ваша загрузка и сохранение работы, так что это просто псевдо код, который вам нужно изменить для использования.

+0

wow спасибо за подробный ответ! Могу ли я задать еще один небольшой вопрос? Сохранение не является обязательным, как в случае «когда пользователь не сохранил его сам по себе, я бы хотел, чтобы эпос сделал это для него». Поэтому я посмотрел на метод Observer.if() и, похоже, это подойдет, но я не могу это сделать, возможно, в «loadOtherDataEpc». – robinvdvleuten

+0

Просто используйте простой if/else условный – jayphelps

+0

https://gist.github.com/jayphelps/7e708b59c17b4f327558e7e4501a0536 – jayphelps