Await é um erro de palavra reservada dentro da função assíncrona

91

Estou lutando para descobrir o problema com a seguinte sintaxe:

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

Eu continuo recebendo erros dizendo:

aguardar é uma palavra reservada

... mas não é legal em uma função assíncrona?

O bit de despacho está vindo da biblioteca react-thunk .

Ilja
fonte
6
Não está dentro de uma função assíncrona. Está dentro da função que começa com (dispatch) => , e não é assíncrona. Por que você tem que sendVerificationEmailretornar outra função em vez de realizar alguma ação?
JLRishe de
3
@JLRishe realmente precisa ser que async (dispatch) =>você possa postar isso como uma resposta, eu preciso devolvê-lo para ter acesso ao despacho
Ilja

Respostas:

152

Para usar await, a função que o envolve diretamente precisa ser assíncrona. De acordo com seu comentário, adicionar asyncà função interna corrige seu problema, então postarei isso aqui:

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

Possivelmente, você poderia remover o asyncda função externa porque ela não contém nenhuma operação assíncrona, mas isso dependeria se o chamador desse sendVerificationEmailestá esperando sendVerificationEmailretornar uma promessa ou não.

JLRishe
fonte
8
Na verdade, esse assíncrono externo não é necessário
Ilja
1
Ahh! Obrigado! Eu tive o mesmo problema dentro de um forEach ... brutal :)
Nick Steele
Idem aqui para usar o await incorporado em um forEach e, em seguida, em uma função assíncrona.
Opus1217 de