Как преобразовать избыточное действие, которое возвращает обещание использовать async / await? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь подключить избыточный thunk в Next.js, и он работает нормально, если мой thunk возвращает обещание.Как я могу преобразовать это, чтобы использовать async / await?Я взглянул на эту статью (, как асинхронизировать / ожидать действия избыточного потока? ), но у меня возникают проблемы, когда я оборачиваюсь вокруг нее.

Мой getInitialProps в моем index.js равен

static  getInitialProps(props) {
    const {store, isServer} = props.ctx;
    if (!store.getState().placeholderData) {
      return store.dispatch(loadData());
    }

, и в настоящее время мое действие по загрузке данных составляет

export const loadData = () => (dispatch) => {
  return isoFetch(homeES_endpoint)
    .then(res => res.json())
    .then(data => dispatch(loadDataSuccess(data)))
      .catch(err => console.error('error loading data', err.toString()));
}

Как я могу преобразовать loadData виспользовать async / await?Я пробовал

export const loadData =  () => async (dispatch) => {
  try {
    const res = await isoFetch(homeES_endpoint);
    const data = await res.json();
    dispatch(loadDataSuccess(data));
  } catch(error) {
    //dispatch({ type: LOGIN_ERROR, error });
    console.error('error loading data',error.toString())

  }
}

, но основной getInitialProps в '_app.js' его не ждет.

1 Ответ

0 голосов
/ 29 января 2019

Это не относится к редуксам.async..await - синтаксический сахар для обещаний.Если вы знаете, как именно это работает, его можно применять в любой ситуации.await является заменой .then(...).try..catch является заменой catch(...):

export const loadData = () => async (dispatch) => {
  try {
    const res = await isoFetch(homeES_endpoint);
    const data = await res.json();
    const result = await dispatch(loadDataSuccess(data));
    return result;
  } catch (err) {
    console.error('error loading data', err.toString()));
  }
}

Разница в том, что dispatch(...) возвращается из then и, следовательно, для правильного перевода необходимо, чтобы он был await ed.Известная ошибка async..await заключается в том, что если обещание возвращается с return dispatch(...), оно не будет обработано с try..catch.

...