我正在努力用以下语法找出问题:
export const sendVerificationEmail = async () =>
(dispatch) => {
try {
dispatch({ type: EMAIL_FETCHING, payload: true });
await Auth.sendEmailVerification();
dispatch({ type: EMAIL_FETCHING, payload: false }))
} catch (error) {
dispatch({ type: EMAIL_FETCHING, payload: false });
throw new Error(error);
}
};
我不断收到错误消息:
await 是保留字
...但是在异步函数中它不是合法的吗?
调度位来自 react-thunk 库。
(dispatch) =>
开头的函数内部,并且不是异步的。为什么您让 sendVerificationEmail
返回另一个函数而不是执行某些操作?
async (dispatch) =>
,您可以将其发布为答案,我需要将其退回以获取调度权限
为了使用 await
,直接包含它的函数需要是异步的。根据您的评论,将 async
添加到内部函数可以解决您的问题,因此我将在此处发布:
export const sendVerificationEmail = async () =>
async (dispatch) => {
try {
dispatch({ type: EMAIL_FETCHING, payload: true });
await Auth.sendEmailVerification();
dispatch({ type: EMAIL_FETCHING, payload: false }))
} catch (error) {
dispatch({ type: EMAIL_FETCHING, payload: false });
throw new Error(error);
}
};
可能,您可以从外部函数中删除 async
,因为它不包含任何异步操作,但这取决于 sendVerificationEmail()
的调用者是否期望它返回一个承诺。
解决方案
在您使用的范围内直接使用 await
async
并删除顶部范围 async
,因为它是多余的。
正确的写法:
const sendVerificationEmail = () =>
async (dispatch) => {
await Auth.sendEmailVerification();
// some code..
};
细化
您遇到了错误,因为您在具有 await
的范围内直接使用了没有 async
的 await
关键字,那里有 2 个函数,一个在另一个函数中,async
在顶部但不在内在的,重要的地方。
错误的方法:
const sendVerificationEmail = async () =>
// notice that an async before the (dispatch) is missing
(dispatch) => {
await Auth.sendEmailVerification();
// some code..
};
由此,将生成一个错误(Chrome 提供的最新错误):
Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
参考
异步函数
异步函数是使用 async 关键字声明的函数,其中允许使用 await 关键字。 async 和 await 关键字使异步的、基于 Promise 的行为能够以更简洁的方式编写,避免了显式配置 Promise 链的需要。