Await adalah kesalahan kata yang dipesan di dalam fungsi async

91

Saya berjuang untuk mencari tahu masalah dengan sintaks berikut:

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

Saya terus mendapatkan kesalahan yang mengatakan:

menunggu adalah kata yang dipesan

... tapi bukankah legal dalam fungsi async?

Bit pengiriman berasal dari perpustakaan react-thunk .

Ilja
sumber
6
Ini tidak ada di dalam fungsi async. Itu ada di dalam fungsi yang dimulai dengan (dispatch) => , dan itu bukan asinkron. Mengapa Anda sendVerificationEmailmengembalikan fungsi lain daripada melakukan beberapa tindakan?
JLRishe
3
@JLRishe memang perlu async (dispatch) =>Anda dapat memposting itu sebagai jawaban, saya perlu mengembalikannya untuk mendapatkan akses ke pengiriman
Ilja

Jawaban:

152

Untuk menggunakan await, fungsi yang secara langsung melingkupinya harus asinkron. Menurut komentar Anda, menambahkan asyncke fungsi bagian dalam memperbaiki masalah Anda, jadi saya akan mempostingnya di sini:

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

Mungkin, Anda bisa menghapus fungsi asyncdari luar karena tidak berisi operasi asinkron apa pun, tetapi itu akan bergantung pada apakah pemanggilnya sendVerificationEmailmengharapkan sendVerificationEmailuntuk mengembalikan sebuah janji atau tidak.

JLRishe
sumber
8
Memang asinkron luar itu tidak diperlukan
Ilja
1
Ahh! Terima kasih! Saya memiliki masalah yang sama di dalam forEach ... brutal :)
Nick Steele
Lakukan di sini untuk menggunakan await yang disematkan di forEach dan kemudian dalam fungsi async.
Opus1217