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

Ilj*_*lja 75 javascript async-await reactjs redux

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

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);
    }
  };
Run Code Online (Sandbox Code Playgroud)

我一直收到错误说:

等待是一个保留字

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

调度位来自react-thunk库.

JLR*_*she 130

为了使用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);
    }
  };
Run Code Online (Sandbox Code Playgroud)

可能,你可以async从外部函数中删除它,因为它不包含任何异步操作,但这取决于它的调用者是否sendVerificationEmail期望sendVerificationEmail返回一个promise.

  • 确实不需要外部异步 (7认同)
  • 啊!谢谢!我在 forEach 中遇到了同样的问题......残酷:) (3认同)
  • 同样,在 forEach 中使用await,然后在异步函数中使用await。 (2认同)

Sta*_*kin 6

解决方案

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

正确的写法是:

const sendVerificationEmail = () =>
  async (dispatch) => {
    await Auth.sendEmailVerification();
    // some code..
  };
Run Code Online (Sandbox Code Playgroud)

阐述

您遇到了错误,因为您在范围内直接使用了await没有 the 的关键字,那里有 2 个函数,一个在另一个函数内,您在顶部的函数上有,但在内部的函数上没有,这很重要。asyncawaitasync

错误的方法:

const sendVerificationEmail = async () =>
  // notice that an async before the (dispatch) is missing
  (dispatch) => {
    await Auth.sendEmailVerification();
    // some code..
  };
Run Code Online (Sandbox Code Playgroud)

由此,将生成一个错误(Chrome 提供的最新错误):

Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules

参考

Async Functions

异步函数是使用 async 关键字声明的函数,并且其中允许使用await 关键字。async 和await 关键字使得能够以更简洁的风格编写基于promise 的异步行为,从而避免了显式配置promise 链的需要。