Ожидает, что создатель асинхронного действия обновит состояние внутри другого создателя действия

#javascript #reactjs #react-redux #redux-thunk

#javascript #reactjs #реагировать-redux #redux-thunk

Вопрос:

У меня есть создатель действия, который выполняет асинхронный запрос и обновляет состояние (используя промежуточное программное обеспечение react-redux):

 export function requestA() {
  return function (dispatch) {
    dispatch(startRequest())
    return Service.getA().then(
      data => dispatch(receivedA(data)),
      error => console.log("An error occurred.", error)
    )
  }
}
  

Это работает нормально.
Теперь я хочу создать другого создателя действия, который будет использовать создателя requestA() действия и вызовет другой асинхронный запрос.

 export function requestB() {
  return function (dispatch, getState) {
    dispatch(requestA()) // <--- How to await for this ???
    let A_data = getState().A_data;
    return Service.getB(A_data).then(
      data => dispatch(receivedB(data)),
      error => console.log("An error occurred.", error)
    )
  }
}
  

Есть ли у меня способ дождаться dispatch(requestA()) завершения, прежде чем я продолжу запускать остальную часть функции?
Мне нужно, чтобы состояние было обновлено, прежде чем я перейду к следующему запросу.

Примечание Я знаю, что мог бы сделать это, вызвав 2 запроса в моем создателе действий, но я хочу знать, могу ли я сделать это, вызвав dispatch(requestA()) , поскольку логика для этого уже установлена.

Комментарии:

1. Вы пытались добавить .then after dispatch(requestA()) ?

2. Спасибо! Не знал, что он вернул обещание!

Ответ №1:

Вам просто нужно дождаться завершения вызова функции с использованием await async ключевых слов:

 export function requestA() {
  return async function (dispatch) {
    dispatch(startRequest())
    await Service.getA().then(
      data => dispatch(receivedA(data)),
      error => console.log("An error occurred.", error)
    )
  }
}