Await, eşzamansız işlev içinde ayrılmış bir kelime hatasıdır


91

Aşağıdaki sözdizimi ile sorunu çözmekte zorlanıyorum:

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

Sürekli şunu söyleyerek hata alıyorum:

beklemek ayrılmış bir kelimedir

... ancak eşzamansız bir işlev içinde yasal değil mi?

Gönderim biti react-thunk kitaplığından geliyor.


6
Zaman uyumsuz bir işlevin içinde değil. Bu, ile başlayan işlevin içindedir (dispatch) => ve bu eşzamansız değildir. Neden sendVerificationEmailbir eylem yapmak yerine başka bir işlevi döndürmek istiyorsunuz ?
JLRishe

3
@JLRishe gerçekten de bunu async (dispatch) =>bir cevap olarak gönderebilmeniz gerekiyor, gönderime erişmek için geri göndermem gerekiyor
Ilja

Yanıtlar:


152

Kullanmak için await, doğrudan onu çevreleyen işlevin zaman uyumsuz olması gerekir. Yorumunuza göre async, iç işleve eklemek sorununuzu düzeltir, bu yüzden burada yayınlayacağım:

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

Muhtemelen, asynceşzamanlı olmayan herhangi bir işlem içermediği için dış işlevden kaldırabilirsiniz , ancak bu, arayan kişinin bir söz vermeyi sendVerificationEmailbekleyip beklememesine bağlıdır sendVerificationEmail.


8
Aslında, dış eşzamansız gerekli değildir
Ilja

1
Ahh! Teşekkür ederim! Aynı sorunu bir forEach içinde yaşadım ... acımasız :)
Nick Steele

Bir forEach ve sonra bir zaman uyumsuz işlevde gömülü kullanım için burayı aynen kullanın.
Opus1217
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.