Await เป็นข้อผิดพลาดของคำสงวนในฟังก์ชัน async


91

ฉันกำลังดิ้นรนเพื่อหาปัญหาเกี่ยวกับไวยากรณ์ต่อไปนี้:

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

ฉันได้รับข้อผิดพลาดอยู่เสมอว่า:

การรอคอยเป็นคำสงวน

... แต่มันไม่ถูกต้องตามกฎหมายในฟังก์ชัน async ใช่หรือไม่?

บิตการจัดส่งมาจากไลบรารีreact-thunk


6
มันไม่ได้อยู่ในฟังก์ชัน async มันอยู่ในฟังก์ชันที่ขึ้นต้นด้วย(dispatch) => ไม่ใช่ async เหตุใดคุณจึงsendVerificationEmailส่งคืนฟังก์ชันอื่นแทนที่จะดำเนินการบางอย่าง
JLRishe

3
@JLR แน่นอนว่าต้องเป็นasync (dispatch) =>คุณสามารถโพสต์ได้ว่าเป็นคำตอบฉันต้องส่งคืนเพื่อเข้าถึงการจัดส่ง
Ilja

คำตอบ:


152

ในการใช้งานawaitฟังก์ชันที่ปิดล้อมโดยตรงจะต้องเป็น async ตามความคิดเห็นของคุณการเพิ่มasyncฟังก์ชันภายในช่วยแก้ไขปัญหาของคุณได้ดังนั้นฉันจะโพสต์ที่นี่:

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

อาจเป็นไปได้ว่าคุณสามารถลบออกasyncจากฟังก์ชันภายนอกได้เนื่องจากไม่มีการดำเนินการแบบอะซิงโครนัสใด ๆ แต่จะขึ้นอยู่กับว่าผู้เรียกที่sendVerificationEmailคาดหวังว่าsendVerificationEmailจะส่งคืนสัญญาหรือไม่


8
แน่นอนว่าไม่จำเป็นต้อง async ภายนอก
Ilja

1
อ๊ะ! ขอขอบคุณ! ฉันมีปัญหาเดียวกันใน forEach ... โหดร้าย :)
Nick Steele

ตรงนี้สำหรับการใช้ await ที่ฝังอยู่ใน forEach แล้วในฟังก์ชัน async
Opus1217
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.