Oczekiwanie to błąd słowa zastrzeżonego w funkcji asynchronicznej

89

Próbuję rozwiązać problem z następującą składnią:

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

Ciągle otrzymuję błąd mówiąc:

await to słowo zastrzeżone

... ale czy nie jest to legalne w ramach funkcji asynchronicznej?

Bit wysyłki pochodzi z biblioteki React-thunk .

Ilja
źródło
6
Nie znajduje się w funkcji asynchronicznej. Znajduje się w funkcji, która zaczyna się od (dispatch) => , i nie jest asynchroniczna. Dlaczego sendVerificationEmailzamiast wykonywać jakąś akcję, zwracasz inną funkcję?
JLRishe
3
@JLRishe rzeczywiście musi być, async (dispatch) =>abyś mógł opublikować, że jako odpowiedź muszę to zwrócić, aby uzyskać dostęp do wysyłki
Ilja

Odpowiedzi:

148

Aby można było użyć await, funkcja bezpośrednio ją otaczająca musi być asynchroniczna. Zgodnie z twoim komentarzem dodanie asyncdo funkcji wewnętrznej rozwiązuje problem, więc opublikuję to tutaj:

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

Możliwe, że można by usunąć asyncfunkcję zewnętrzną, ponieważ nie zawiera ona żadnych operacji asynchronicznych, ale to zależy od tego, czy wywołujący sendVerificationEmailoczekuje sendVerificationEmailzwrotu obietnicy, czy nie.

JLRishe
źródło
8
Rzeczywiście, ta zewnętrzna asynchronizacja nie jest potrzebna
Ilja
1
Ahh! Dziękuję Ci! Miałem ten sam problem wewnątrz forEach ... brutalny :)
Nick Steele
To samo dotyczy używania await osadzonego w forEach, a następnie w funkcji async.
Opus1217