คุณได้อย่างมีประสิทธิภาพโดยใช้สัญญาภายในฟังก์ชั่นคอนสตรัคผู้จัดการสัญญาดังนั้นนี้สัญญาคอนสตรัคต่อต้านรูปแบบ
รหัสของคุณเป็นตัวอย่างที่ดีของความเสี่ยงหลัก: ไม่เผยแพร่ข้อผิดพลาดทั้งหมดอย่างปลอดภัย อ่านทำไมมี
นอกจากนี้การใช้async
/ await
สามารถสร้างกับดักเดียวกันได้อย่างน่าประหลาดใจยิ่งขึ้น เปรียบเทียบ:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
ด้วยความไร้เดียงสา (ผิด) async
เทียบเท่า:
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
ดูในเว็บคอนโซลของเบราว์เซอร์เป็นรายการสุดท้าย
อันแรกใช้งานได้เนื่องจากข้อยกเว้นใด ๆ ในทันทีในฟังก์ชันตัวดำเนินการตัวสร้างสัญญาจะปฏิเสธสัญญาที่สร้างขึ้นใหม่อย่างสะดวก (แต่ภายในสิ่งที่.then
คุณอยู่เอง)
คนที่สองไม่ได้เพราะข้อยกเว้นใด ๆ ทันทีในasync
ฟังก์ชั่นปฏิเสธสัญญาโดยปริยายส่งกลับโดยasync
ฟังก์ชั่นของตัวเอง
เนื่องจากไม่ได้ใช้ค่าที่ส่งคืนของฟังก์ชันตัวดำเนินการตัวสร้างสัญญาจึงเป็นข่าวร้าย
รหัสของคุณ
ไม่มีเหตุผลใดที่คุณไม่สามารถกำหนดได้myFunction
ว่าasync
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
ทำไมต้องใช้ไลบรารีควบคุมการทำงานพร้อมกันที่ล้าสมัยเมื่อคุณมีawait
?