Async / Await и Redux Thunks: вызов «dispatch» неявно возвращает обещание от thunk? - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь обернуть голову вокруг 'async / await', тот факт, что async функции всегда возвращают Promises, и использую асинхронные функции с Redux Thunks -

Я понимаю, что async функции по определению всегда возвращают обещание.Что, если последняя строка асинхронной функции не является await, хотя?

const foo = async (y, z) => {
  await somethingElse()
  const x = y + z;
}

Возвращает ли foo Promise, который разрешается в 'x', потому что он находится в последней строке?Если нет, то что Promise возвращает?

Итак, при написании thunk у меня есть такая функция

export const loadData = key => async (dispatch) => {
  const url = 'http://something.com/api/v1/get_key';
  const keyObj = { key };
  const method = 'POST';
  const headers = { 'Content-Type': 'application/json' };
  const body = JSON.stringify(keyObj);

  try {
    const res = await isofetch(url, { method, headers, body });
    const data = await res.json();
    dispatch(loadDataSuccess(data));
  } catch (e) {
    debug('error with fetch', e.toString());
  }

Что возвращает loadData?Я считаю, что dispatch возвращает Promise, поэтому loadData возвращает это Promise неявно?

Есть ли разница, если последняя строка была

return dispatch(loadDataSuccess(data));

?Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019
const foo = async (y, z) => {
  await somethingElse()
  const x = y + z;
}

Да, это вернет обещание.Но он не будет определен, поскольку вы не разрешили его.

Promise {<resolved>: undefined}

Как только ожидание закончится, foo получит разрешенные данные.

Я полагаю, что отправка возвращаетОбещание

Нет, это не так.Вам нужно будет вернуть значение из асинхронной функции, чтобы получить разрешенные данные из обещания.Таким образом, вы будете использовать:

return dispatch(loadDataSuccess(data));

Если вы не вернете значение в своей асинхронной функции, вам нужно дождаться этого обещания, чтобы получить данные:

await foo(y, z) // without return
foo(y, z) // with return

Технически, это ваше мнение, что делать с вашей асинхронной операцией foo.

0 голосов
/ 21 февраля 2019

Функция сама вернет обещание.

const res = await isofetch(url, { method, headers, body });
const data = await res.json();
dispatch(loadDataSuccess(data));

Диспетчеризация здесь отправит ответ объекта json.Вам не нужно возвращать его.

...