Как связать действия и эпосы?

Я знаком с React и Redux, но новичок в RxJS и redux-observable.

Я работаю над потоком, который мне удалось решить с помощью чего-то вроде этого:

const reducer = (state, action)  => {
   switch(action.type) {
   // some other cases here
   case Types.LOCATION_GEOCODED: 
      const { address, place_id } = action
      return {...state, address, place_id }
   }
}

const updateLocationEpic = (action$, store) =>
   action$.ofType(Types.UPDATE_LOCATION)
   .mergeMap((action) =>
      Observable.fromPromise(reverseGeocode(store.getState().location))
      .map(({address, place_id}) => ({type: Types.LOCATION_GEOCODED, address, place_id}))
   )

const broadcastLocationEpic = (action$, store) =>
   action$.ofType(Types.LOCATION_GEOCODED)
   .map((action) => ({type: Types.NEW_CURRENT_LOCATION, store.getState().location}))

Первый эпик выдает действие LOCATION_GEOCODED после асинхронного запроса, редуктор затем «завершает» информацию о местоположении, и, наконец, второй эпик берет полное местоположение из состояния и транслирует его.

Ключевым моментом является обеспечение того, чтобы действие NEW_CURRENT_LOCATION запускалось после, когда редуктор обработал предыдущее действие (LOCATION_GEOCODED), потому что ему нужно запросить состояние, которое только что было обновлено.

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

Есть ли лучший способ выполнить это в отдельном эпосе?


person Juan Pablo Saraceno    schedule 13.06.2017    source источник
comment
это ваш map называет опечатку только в вашем вопросе? например один из них map(({address, place_id}) => {type: Types.LOCATION_GEOCODED, address, place_id}) - это возвращаемый объект с ошибкой синтаксического анализа, который необходимо заключить в круглые скобки. Это также почти наверняка опечатка: {type: Types.NEW_CURRENT_LOCATION, store.getState().location} это не ошибка синтаксического анализа, а фактически создает блок с помеченным оператором, за которым следует посторонний вызов для получения этого состояния без возвращаемого значения. Совершенно не то, что вы хотели :)   -  person jayphelps    schedule 14.06.2017
comment
Опечатка, извините. В реальном примере я использую reduxsauce и вызываю функцию создателя, подумал о том, чтобы просто поместить объект плана, чтобы было проще. Я исправлю пример   -  person Juan Pablo Saraceno    schedule 16.06.2017


Ответы (1)


person    schedule
comment
Означает ли это, что нам нужно создавать другой тип действия для каждого промежуточного результата? Возможно ли, чтобы более поздний процесс повторно использовал предыдущее значение, не отправляя действие специально для этого? - person Hendy Irawan; 21.01.2019
comment
Да, вам нужно действие для каждого промежуточного результата, вы можете использовать одно и то же действие с разными аргументами и filter аргументами, если это лучше для вас. - person Anas; 21.01.2019