2016-01-20 2 views
3

У меня есть действие, которое обновляет некоторые критерии поиска в Redux. Я хотел бы сразу получить некоторые данные из API на основе этих локальных критериев. Проблема в том, что, хотя отправка действия критериев поиска является синхронной, она не будет завершена до начала отправки результатов поиска.Как отправить действие, когда другое синхронное действие завершено в Redux

В этом примере критерии не будут обновлены до вызова API:

this.props.dispatch(updateLocalCriteria(someData)); 
this.props.dispatch(fetchApiResults(this.props.criteria)) 

Я пропускаю что-то очевидное? Я могу придумать несколько хакерских способов справиться с этим, но что это лучший способ? Должен ли я устанавливать флаг при обновлении критериев поиска и получать результаты в componentDidUpdate(), если флаг является истинным? Или я должен сделать updateLocalCriteria() асинхронным, чтобы я мог цепочки fetchApiResults() в цепочке обещаний?

EDIT

Я думаю, что я нашел свой ответ. Я могу получить текущее состояние в пределах fetchApiResults(). Поэтому я могу получить текущие критерии поиска перед вызовом api.

function fetchApiResults() { 
    return (dispatch, getState) => { 
     const state = getState(); 
     // fetch data and dispatch... 

ответ

1

В вашем updateLocalCriteria, вы, вероятно, уже изменить один из реквизита вашего редуктора на новое значение, я буду называть его criteria.

Что вы могли бы сделать вместо этого создать еще одно действие, скажем updateCriteriaAndFetch, что будет называться так же, как вы делали:

this.props.dispatch(updateCriteriaAndFetch(newCriteria)) 

Что вы определить в основном как так

export const updateCriteriaAndFetch = criteria => dispatch => { 
    dispatch(updateLocalCriteria(criteria)) 
    dispatch(fetchApiResults(criteria)) 
} 

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

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

+0

'updateLocalCriteria()' просто обновляет одно свойство критериев, но я хочу отправить все критерии в 'fetchApiResults()'. По-моему, мне все равно нужно получить текущее состояние в 'updateCriteriaAndFetch()' перед вызовом 'fetchApiResults()'. –

+0

В этом случае да –

Смежные вопросы