Async / Await和Redux Thunks:调用'dispatch'是否隐式返回thunk的诺言?

时间:2019-02-21 18:00:53

标签: javascript redux promise async-await redux-thunk

我正试图绕过'async / await',事实是async函数总是返回Promises并在Redux Thunks中使用异步函数-

我知道async函数总是会返回一个承诺。但是,如果异步功能的最后一行不是await,该怎么办?

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

foo是否会返回解析为'x'的Promise,因为它在最后一行?如果没有,它返回什么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 :(得分:2)

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

是的,这将返回承诺。但这是不确定的,因为您还没有解决它。

Promise {<resolved>: undefined}

等待完成后,foo将获取已解析的数据。

  

我相信调度会返回一个承诺

不,不是。您需要从异步函数返回值,以便从promise中获得已解析的数据。因此,您将使用:

return dispatch(loadDataSuccess(data));

如果您未在异步函数中返回该值,则需要等待该诺言才能获取数据:

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

从技术上讲,您认为如何处理异步foo操作。

答案 1 :(得分:1)

该函数本身将返回一个承诺。

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

在此调度将调度json对象响应。您不需要将其退回。