ChatGPT解决这个技术问题 Extra ChatGPT

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

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

调度位来自 react-thunk 库。

它不在异步函数中。它在以 (dispatch) => 开头的函数内部,并且不是异步的。为什么您让 sendVerificationEmail 返回另一个函数而不是执行某些操作?
@JLRishe 确实需要async (dispatch) =>,您可以将其发布为答案,我需要将其退回以获取调度权限

J
JLRishe

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


确实不需要外部异步
啊!谢谢!我在 forEach 中遇到了同样的问题......残酷:)
同样在这里使用嵌入在 forEach 中的 await,然后在 async 函数中。
S
Stas Sorokin

解决方案

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

正确的写法:

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

细化

您遇到了错误,因为您在具有 await 的范围内直接使用了没有 asyncawait 关键字,那里有 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 链的需要。