AWAIT是异步函数中的保留字错误

我正在努力解决以下语法的问题:

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是保留字

...但它在异步函数中不是合法的吗?

调度位来自反应-重击库。

314790 次浏览

为了使用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()的调用方是否期望它返回承诺。

解决方案

直接在async使用的范围内使用await,并删除顶部范围async,因为它是多余的。

正确的写法是:

const sendVerificationEmail = () =>
async (dispatch) => {
await Auth.sendEmailVerification();
// some code..
};

阐述

出现错误是因为您使用了await关键字,而没有直接在await的范围内使用async,您有两个函数,一个在另一个内部,您在顶部的函数上有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 Functions

异步函数是使用async关键字声明的函数, 其中允许使用await关键字。async和await关键字 允许在清理器中编写异步的、基于承诺的行为 样式,避免了显式配置承诺链的需要。