ฉันไม่สามารถคาดศีรษะได้ว่าทำไมสิ่งนี้ถึงไม่ได้
เพราะmainคืนสัญญา asyncฟังก์ชั่นทั้งหมดทำ
ที่ระดับบนสุดคุณต้อง:
ใช้asyncฟังก์ชั่นระดับสูงสุดที่ไม่เคยปฏิเสธ (เว้นแต่คุณต้องการข้อผิดพลาด "ปฏิเสธการจัดการ") หรือ
ใช้thenและcatchหรือ
(เร็ว ๆ นี้!)ใช้ระดับสูงสุดawaitข้อเสนอที่มาถึงขั้นตอนที่ 3 ในกระบวนการที่อนุญาตให้ใช้ระดับบนสุดของawaitในโมดูล
# 1 - asyncฟังก์ชั่นระดับบนสุดที่ไม่เคยปฏิเสธ
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
แจ้งให้ทราบล่วงหน้าcatch; คุณต้องจัดการข้อยกเว้นการปฏิเสธ / async ตามสัญญาเนื่องจากไม่มีสิ่งใดเกิดขึ้น คุณไม่มีผู้โทรเพื่อส่งต่อให้ หากคุณต้องการคุณสามารถทำเช่นนั้นกับผลลัพธ์ของการโทรผ่านcatchฟังก์ชัน (แทนtry/ catchไวยากรณ์):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... ซึ่งกระชับกว่านี้เล็กน้อย (ฉันชอบด้วยเหตุผลนั้น)
หรือแน่นอนไม่จัดการข้อผิดพลาดและอนุญาตให้เกิดข้อผิดพลาด "ปฏิเสธการจัดการ"
# 2 - thenและcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
catchจัดการจะถูกเรียกว่าข้อผิดพลาดเกิดขึ้นในห่วงโซ่หรือในของคุณthenจัดการ (ตรวจสอบให้แน่ใจว่าcatchตัวจัดการของคุณไม่โยนข้อผิดพลาดเนื่องจากไม่มีการลงทะเบียนเพื่อจัดการกับพวกเขา)
หรือทั้งสองข้อโต้แย้งไปที่then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
แจ้งให้ทราบอีกครั้งว่าเรากำลังลงทะเบียนตัวจัดการการปฏิเสธ แต่ในแบบฟอร์มนี้ตรวจสอบให้แน่ใจว่าการthenโทรกลับของคุณไม่ได้เกิดข้อผิดพลาด แต่อย่างใดไม่มีการลงทะเบียนเพื่อจัดการกับพวกเขา
# 3 ระดับสูงสุดawaitในโมดูล
คุณไม่สามารถใช้awaitที่ระดับสูงสุดของสคริปต์ที่ไม่ใช่โมดูล แต่ข้อเสนอระดับบนสุดawait ( ขั้นตอนที่ 3 ) ช่วยให้คุณสามารถใช้งานได้ที่ระดับบนสุดของโมดูล มันคล้ายกับการใช้asyncฟังก์ชั่น wrapper ระดับบนสุด(# 1 ด้านบน) ในที่ที่คุณไม่ต้องการให้รหัสระดับบนสุดของคุณที่จะปฏิเสธ (โยนข้อผิดพลาด) เพราะมันจะทำให้เกิดข้อผิดพลาดการปฏิเสธการจัดการ ดังนั้นหากคุณไม่ต้องการให้มีการปฏิเสธที่ไม่สามารถจัดการได้เมื่อสิ่งต่าง ๆ เกิดข้อผิดพลาดเช่นเดียวกับ # 1 คุณต้องล้อมโค้ดของคุณไว้ในเครื่องมือจัดการข้อผิดพลาด:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
โปรดทราบว่าหากคุณทำสิ่งนี้โมดูลใด ๆ ที่นำเข้าจากโมดูลของคุณจะรอจนกว่าสัญญาที่คุณกำลังจะawaitตกลง เมื่อโมดูลที่ใช้ระดับสูงสุดawaitได้รับการประเมินโดยทั่วไปแล้วจะส่งคืนสัญญาไปยังโมดูลตัวโหลด (เช่นasyncฟังก์ชันทำ) ซึ่งจะรอจนกว่าสัญญานั้นจะถูกตัดสินก่อนที่จะประเมินเนื้อหาของโมดูลใด ๆ ที่ขึ้นอยู่กับมัน
awaitไม่มีอะไรนอกจากน้ำตาลสำหรับthenไวยากรณ์สัญญา