我正试图绕过'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));
?感谢您的帮助!
答案 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对象响应。您不需要将其退回。