Warten ist ein reservierter Wortfehler innerhalb der asynchronen Funktion

85

Ich habe Probleme, das Problem mit der folgenden Syntax herauszufinden:

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

Ich bekomme immer wieder Fehler, wenn ich sage:

Warten ist ein reserviertes Wort

... aber ist es innerhalb einer asynchronen Funktion nicht legal?

Das Dispatch-Bit stammt aus der React-Thunk- Bibliothek.

Ilja
quelle
6
Es befindet sich nicht in einer asynchronen Funktion. Es befindet sich in der Funktion, die mit beginnt (dispatch) => , und das ist nicht asynchron. Warum haben Sie die sendVerificationEmailMöglichkeit, eine andere Funktion zurückzugeben, anstatt eine Aktion auszuführen?
JLRishe
1
@JLRishe in der Tat muss es sein, dass async (dispatch) =>Sie das als Antwort posten könnten, ich muss es zurückgeben, um Zugang zum Versand zu erhalten
Ilja

Antworten:

144

Um verwendet zu werden await, muss die Funktion, die sie direkt einschließt, asynchron sein. Laut Ihrem Kommentar asyncbehebt das Hinzufügen zur inneren Funktion Ihr Problem. Deshalb werde ich das hier posten:

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

Möglicherweise können Sie asyncdie Funktion aus der äußeren Funktion entfernen, da sie keine asynchronen Operationen enthält. Dies hängt jedoch davon ab, ob der Aufrufer davon sendVerificationEmailerwartet sendVerificationEmail, ein Versprechen zurückzugeben oder nicht.

JLRishe
quelle
8
In der Tat ist diese äußere Asynchronität nicht erforderlich
Ilja
1
Ahh! Danke dir! Ich hatte das gleiche Problem in einem forEach ... brutal :)
Nick Steele
Das Gleiche gilt für die Verwendung von await, eingebettet in ein forEach und dann in eine asynchrone Funktion.
Opus1217