Await 是异步函数中的保留字错误溶液阐述参考

2022-08-30 01:31:26

我正在努力通过以下语法找出问题:

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 库。


答案 1

为了使用,直接封闭它的函数需要是异步的。根据您的评论,添加到内部函数可以解决您的问题,因此我将在此处发布:awaitasync

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);
    }
  };

可能,您可以删除 from 外部函数,因为它不包含任何异步操作,但这取决于 的调用方是否期望它返回 promise。asyncsendVerificationEmail()


答案 2

溶液

直接在正在使用的作用域内使用,并删除顶部作用域,因为它是多余的。awaitasyncasync

正确的写法:

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

阐述

你犯了错误,因为你使用了关键字,而没有直接在作用域中,你有2个函数,一个在另一个里面,你有在顶部,但不在内部,这很重要。awaitasyncawaitasync

错误的方式:

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

异步函数是使用异步关键字声明的函数,其中允许使用 await 关键字。async 和 await 关键字允许以更清晰的样式编写基于 promise 的异步行为,从而避免了显式配置 promise 链的需要。