У меня есть сценарий, когда я отправляю действие после успешного вызова API.

axios.get(url)
       .then(response => {
         console.log("RESPONDED", response, dispatch)
         const payload = response
         dispatch(fetchSucess(payload))
       })

Фрагмент для fetchSucess:

const fetchSucess = (payload) => (dispatch) => {
  console.log("FETCH SUCCESS HAPPENED", payload)
  return {
    type: someActionTypes.FETCH_ALL_SUCCESS,
    payload,
  }
}

Как ни странно, FETCH_ALL_SUCCESS не запускается. если я заменю return на dispatch, тогда он заработает. Почему он не работает, когда я отправляю его из обратного вызова api? Помощь будет очень признательна!

0
ShocKwav3_ 23 Окт 2018 в 00:36

2 ответа

Лучший ответ

У вас есть эта проблема, потому что функция fetchSuccess определена неправильно. Если вы посмотрите внимательнее, то заметите, что вызов fetchSucess(payload) возвращает стрелочную функцию :

(dispatch) => {
  console.log("FETCH SUCCESS HAPPENED", payload)
  return {
    type: someActionTypes.FETCH_ALL_SUCCESS,
    payload,
  }
}

В то время как dispatch принимает объект, поэтому функция fetchSuccess должна возвращать объект действия :

{
    type: someActionTypes.FETCH_ALL_SUCCESS,
    payload,
}

Поэтому функция fetchSuccess должна выглядеть примерно так:

const fetchSucess = (payload) => {
  console.log("FETCH SUCCESS HAPPENED", payload)
  return {
    type: someActionTypes.FETCH_ALL_SUCCESS,
    payload,
  }
}
1
Volodymyr 22 Окт 2018 в 22:03

Глядя на фрагмент, я предполагаю, что вы используете промежуточное программное обеспечение redux-thunk (вы, возможно, забыли упомянуть об этом?). В этом случае подход, описанный ниже, является правильным. Здесь fetchData - преобразователь, а fetchSuccess - действие.

const fetchSuccess = (payload) => ({
  type: someActionTypes.FETCH_ALL_SUCCESS,
  payload
})

const fetchData = () => (dispatch) => {
  axios.get(url)
     .then(response => {
       console.log("RESPONDED", response, dispatch)
       dispatch(fetchSuccess(response))
     })
}
1
Vishal Sharma 22 Окт 2018 в 22:17
52938101