ฉันไม่สามารถคาดศีรษะได้ว่าทำไมสิ่งนี้ถึงไม่ได้
เพราะ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
ไวยากรณ์สัญญา